android 4.1中有应用报出:
java.lang.NullPointerException
at android.widget.TextView.sendBeforeTextChanged(TextView.java:7044)
而往下的log信息都没有应用相关的信息,只知道被它搞死的应用是哪个。后发现该应用中有这么一行代码:
searchEdit.addTextChangedListener(null);
下面说明为什么这么一行会把应用搞死。
TextView.java中的如下函数:
public void addTextChangedListener(TextWatcher watcher) {
if(mListeners == null) {
mListeners = new ArrayList<TextWatcher >();
}
mListeners.add(watcher);
}
private void sendBeforeTextChanged(CharSequence text, int start, int before, int after) {
if(mListeners != null) {
final ArrayList<TextWatcher> list = mListeners;
final int count = list.size();
for(int i = 0; i < count; i++) {
list.get(i).beforeTextChanged(text, start, before, after);
}
}
....
}
上面 list.get(i).beforeTextChanged这行之所以会报空指针,是因为虽然做了list非空的判断,也在for循环了限制了i的大小,但这并不能说明list.get(i) != null.
做个了试验:
ArrayList<String> list = new ArrayList<String>();
list.add(null);
System.out.println("list.size()="+list.size());
System.out.println("list.get(0)="+list.get(0));
输出结果如下:
list.size()=1
list.get(0)=null
以后的警示:
1. 尽量不执行list.add(null);
2. 在list的循环时,要对取出来的元素再做非空判断。