我的App中的自定义ArrayAdapter中出现了Nullpointerexception。我不知道为什么在这里提出Nullpointer。我无法重现这个例外。异常没有出现很长时间,我没有代码更改,所以这使它更奇怪。 代码是:
private class MyAdapter<T> extends ArrayAdapter<String> {
private Map<String, String> selectedDevices;
public MyAdapter(Context context, int textViewResourceId) {
super(context, textViewResourceId);
BluetoothDbAdapter dbHelper = new BluetoothDbAdapter(context);
dbHelper.open();
selectedDevices = dbHelper.fetchAllDevicesAsMap();
dbHelper.close();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
CheckedTextView item = (CheckedTextView) view;
CharSequence text = item.getText();
if (selectedDevices.values().contains(text)) {
item.setChecked(true);
}
return item;
}
}
第一行中的getView方法引发了异常。我调试了我的应用程序并使用null参数调用了super.getView,但没有引发Nullpointerexception,所以它看起来super已经为null,但是怎么会这样? StackTrace是:
显示java.lang.NullPointerException 在android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:355) 在android.widget.ArrayAdapter.getView(ArrayAdapter.java:323) at de.hartig.abt.activity.BluetoothDeviceList $ MyAdapter.getView(BluetoothDeviceList.java :140) 在android.widget.AbsListView.obtainView(AbsListView.java:1408) 在android.widget.ListView.makeAndAddView(ListView.java:1727) 在android.widget.ListView.fillDown(ListView.java:652) 在android.widget.ListView.fillFromTop(ListView.java:709) 在android.widget.ListView.layoutChildren(ListView.java:1580) 在android.widget.AbsListView.onLayout(AbsListView.java:1240) 在android.view.View.layout(View.java:7057) 在android.widget.FrameLayout.onLayout(FrameLayout.java:333) 在android.view.View.layout(View.java:7057) 在android.widget.LinearLayout.setChildFrame(LinearLayout.java:1249) 在android.widget.LinearLayout.layoutVertical(LinearLayout.java:1125) 在android.widget.LinearLayout.onLayout(LinearLayout.java:1042) 在android.view.View.layout(View.java:7057) 在android.widget.FrameLayout.onLayout(FrameLayout.java:333) 在android.view.View.layout(View.java:7057) 在android.view.ViewRoot.performTraversals(ViewRoot.java:1045) 在android.view.ViewRoot.handleMessage(ViewRoot.java:1727) 在android.os.Handler.dispatchMessage(Handler.java:99) 在android.os.Looper.loop(Looper.java:123) 在android.app.ActivityThread.main(ActivityThread.java:4680) at java.lang.reflect.Method.invokeNative(Native Method) 在java.lang.reflect.Method.invoke(Method.java:521) 在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:858) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 在dalvik.system.NativeStart.main(本地方法)
有没有人知道如何解决这个问题?谢谢你的帮助!
答案 0 :(得分:14)
您可能正在调用add
null
值,而ArrayAdapter
正在窒息。要进一步诊断问题,我们需要查看fetchAllDevicesAsMap
的代码或您在ArrayAdapter
添加元素的位置。
createViewFromResource
内ArrayAdapter.java的摘录:
T item = getItem(position);
if (item instanceof CharSequence) {
text.setText((CharSequence)item);
} else {
text.setText(item.toString());
}
如果基础数组中的某个元素为ArrayAdapter
,则表示NullPointerException
将屈服于null
。
答案 1 :(得分:2)
从堆栈跟踪中,您可以清楚地看到super
不是null,因为它确实进入了android.widget.ArrayAdapter.getView()
。
您可以查看android.widget.ArrayAdapter.createViewFromResource
第355行的来源,以尝试确定空指针的真正原因。
<强>更新强>
我看了一下代码,但这行text.setText(item.toString());
失败,因此text
或item
为空。
您可以在这里查看代码: android.widget.ArrayAdapter source