我的NullPointerException来自哪里?

时间:2011-03-04 01:27:16

标签: android nullpointerexception

我目前的应用程序出现了问题,即偶尔用户点击我的某个选项并出现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次报告,但它很烦人,我想深究它。

由于

3 个答案:

答案 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方法。