我目前的应用程序出现了问题,即偶尔用户点击我的某个选项并出现NullPointerException。问题是,错误报告不包含任何信息,我无法弄清楚它为什么会发生。这是提交的堆栈跟踪:
java.lang.NullPointerException
at com.espian.formulae.ListMenu.thermoItemClick(ListMenu.java:754)
at com.espian.formulae.ListMenu$2.onItemClick(ListMenu.java:386)
at android.widget.AdapterView.performItemClick(AdapterView.java:284)
at android.widget.ListView.performItemClick(ListView.java:3672)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:1829)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4633)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
at dalvik.system.NativeStart.main(Native Method)
这是令人讨厌的方法:
protected void thermoItemClick(int position) {
Intent i = new Intent();
TextView t = (TextView)lv.getChildAt(position);
switch (position) {
case 0: //Thermo functions
i.setClass(getApplicationContext(), Tab_Hoster.class);
i.putExtra(Tab_Hoster.EXTRA, Tab_Hoster.TAB_THERMO);
break;
case 1: //C-C equation
case 2: // C equation
case 3: //vant hoff
case 4:
case 5:
case 6:
i.setClass(getApplicationContext(), Equation.class);
break;
default:
i = null;
}
if (i != null) {
String s = (String) t.getText();
i.putExtra(States.KEY_E, s);
i.putExtra(States.TABLE, States.EQUATION);
startActivity(i);
}
if (cleanscreen)
this.finish();
}
如果有帮助的话,通常情况似乎只会在人们第一次选择此选项时出现,之后往往会很好。我自己没有出现这种异常,我只有14次报告,但它很烦人,我想深究它。
由于
答案 0 :(得分:0)
我的猜测是你的位置变量不匹配任何这些情况。另外,尝试不同版本的模拟器,可能是特定于版本的。
答案 1 :(得分:0)
因为它只是第一次发生,所以很可能没有初始化某些东西。变量cleanscreen
来自哪里?它是一个全局变量吗?它是在onCreate期间初始化的,还是在声明它时?
很可能textview是空的。如果t为空(null)则
String s = (String) t.getText()
将为null。
答案 2 :(得分:0)
如果TextView t = (TextView)lv.getChildAt(position);
被错误地调用(即,lv在此位置不包含任何View),则t将为null,t.getText()
将引发异常。
总的来说,我建议避免使用ViewGroup.getChildAt()加载视图。这不安全。我猜你动态构建一个布局,这就是为什么你不能找到这个TextView的ViewById。 我在这样的情况下做的是,当我动态构建布局时,我还为这些布局分配ID(将它们存储在地图或内存中),然后使用非常安全的findViewById方法。