从onWindowFocusChanged调用成员函数时不可能的nullpointer异常

时间:2012-10-23 16:10:24

标签: android nullpointerexception

请帮助理解一个奇怪的无效指针异常,它似乎仅在特定设备上发生(目前仅从不同的平板电脑报告,例如:Nexus-7,Asus,...)。

从其他成员函数调用当前活动的成员函数时发生nullpointer异常:

10-22 13:50:09.190 E/AndroidRuntime(4445): FATAL EXCEPTION: main
10-22 13:50:09.190 E/AndroidRuntime(4445): java.lang.NullPointerException
10-22 13:50:09.190 E/AndroidRuntime(4445): at com.plasmobit.CosmicPatrol.ActLogBook.onWindowFocusChanged(SourceFile:194)
10-22 13:50:09.190 E/AndroidRuntime(4445): at com.android.internal.policy.impl.PhoneWindow$DecorView.onWindowFocusChanged(PhoneWindow.java:2366)
10-22 13:50:09.190 E/AndroidRuntime(4445): at android.view.View.dispatchWindowFocusChanged(View.java:5740)
10-22 13:50:09.190 E/AndroidRuntime(4445): at android.view.ViewGroup.dispatchWindowFocusChanged(ViewGroup.java:851)
10-22 13:50:09.190 E/AndroidRuntime(4445): at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2557)
10-22 13:50:09.190 E/AndroidRuntime(4445): at android.os.Handler.dispatchMessage(Handler.java:99)
10-22 13:50:09.190 E/AndroidRuntime(4445): at android.os.Looper.loop(Looper.java:137)
10-22 13:50:09.190 E/AndroidRuntime(4445): at android.app.ActivityThread.main(ActivityThread.java:4424)
10-22 13:50:09.190 E/AndroidRuntime(4445): at java.lang.reflect.Method.invokeNative(Native Method)
10-22 13:50:09.190 E/AndroidRuntime(4445): at java.lang.reflect.Method.invoke(Method.java:511)
10-22 13:50:09.190 E/AndroidRuntime(4445): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
10-22 13:50:09.190 E/AndroidRuntime(4445): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
10-22 13:50:09.190 E/AndroidRuntime(4445): at dalvik.system.NativeStart.main(Native Method)

第194行的代码是重写的onWindowFocusChange活动界面的一部分。 它只是一个无参数成员函数的调用:

@Override
public void onWindowFocusChanged(boolean hasFocus)
{
    ...
    doSomeStuff();  // Line: 194
    ...
}

private void doSomeStuff()
{
    ....
}

因为我们在onWindowFocusChange函数内部,所以ActLogBook活动实例的this指针应该是有效的,所以这里的nullpointer怎么可能呢?

1 个答案:

答案 0 :(得分:0)

不知道你是否想过这个。我刚刚遇到了类似的问题,因为这是谷歌搜索的唯一相关内容,我认为如果它对某人有帮助,我会分享我的发现。

我在同一个实例上通过无参数方法调用另一个方法抛出了可重现的NPE。最终我想尝试在没有Proguard的情况下构建我的apk。突然,堆栈轨迹在方法内部顶部可见另一条线,似乎是抛出NPE。然后它变得更有意义。

所以再试一次,但在调试过程中不要使用Proguard。我想某些地方肯定会有一些错误使得Proguard有时会省略堆栈顶部的行。