2

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

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

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 指针应该是有效的,那么这里的空指针异常怎么可能呢?

4

1 回答 1

1

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

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

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

于 2013-12-01T10:46:58.923 回答