handleStopActivity 中的 NullPointerException -- 在堆栈跟踪中没有引用我的代码

Posted

技术标签:

【中文标题】handleStopActivity 中的 NullPointerException -- 在堆栈跟踪中没有引用我的代码【英文标题】:NullPointerException in handleStopActivity -- No reference to my code in stack trace 【发布时间】:2011-03-31 15:24:49 【问题描述】:

在这里,我有点不知所措。我在handleStopActivity 中看到了越来越多的NullPointerExceptions。我怀疑随着 2.2 对 Droid 所有者的升级增加,这种增加会同时发生,尽管这只是一个猜测。我自己从未见过崩溃,市场提供的堆栈跟踪没有提及我编写的任何类。因此,我不知道从哪里开始解决问题。

java.lang.NullPointerException
at android.app.ActivityThread.handleStopActivity(ActivityThread.java:3674)
at android.app.ActivityThread.access$2600(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2153)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:144)
at android.app.ActivityThread.main(ActivityThread.java:4937)
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:868)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
at dalvik.system.NativeStart.main(Native Method)

由于不知道原因,也不知道该提供哪些信息来辅助诊断,所以我先来概述一下: 我的应用是 WootWatcher。它跟踪 Woot.com 并通知用户有新的待售商品。它通过在单独进程中运行的服务来实现这一点。服务和主活动通过aidl接口和回调相互通信。我还在服务和活动中使用消息处理程序,并经常为昂贵的任务生成线程。

【问题讨论】:

我运行 droid(仍然没有 2.2 更新,等待中...)如果我看到任何奇怪的东西,我会告诉你。 好吧,我今天收到了 2.2 更新,并在应用程序上玩了一些。我认为没有问题。 @Ben Tobin 你有停止活动的代码吗? 您是否尝试过调试应用程序并找到发生此崩溃的位置? 你能贴出处理handleStopActivity的代码吗? 【参考方案1】:

回顾这个 4 年前的问题,我意识到我应该能够诊断它,但不幸的是,我找不到与这些行匹配的任何 AOSP 版本。 Droid 一定使用了一些未提供的源代码的更改版本。

也就是说,Froyo 的handleStopActivity() 没有太多机会出现空指针异常。当活动已经停止或正在停止时,最有可能指向Activity.finish()

这通常发生在您注册最终调用 finish() 的侦听器并且您没有在 onPause() 中取消注册这些侦听器时。

【讨论】:

【参考方案2】:

我不知道,如果您仍在寻找解决方案,但这是我发现的。如果您找到了真正的解决方案,请告诉我。

我只是遇到了同样的问题.. 我从来没有遇到过这个问题,而且在不更改代码的情况下,它出现是出于某种原因。通过使用谷歌,我找到了约瑟夫发布的问题,但这似乎并不完全相同。我还找到了this 和this。这两个似乎有相同的问题,但没有解决方案.. 然后我找到了this blog。

作者讲述了它的来源 - Android 中的一个错误。此外,它与Cursor 有关。这并没有解决我的问题,但我注意到,我在调用startActivity(someIntent); 之前使用了几行Cursor(我也调用了finish(),但删除该行并没有什么不同)。 我试图删除包含Cursor 的行,但它突然又可以工作了.. 我不知道为什么它有效,但它确实有效。我刚刚将带有Cursor 的代码移到了我的另一个Activity

这绝对不是一个好的解决方案,但它对我有用。

还有一个问题:你甚至使用Cursor 并调用startActivity(..) 或类似的东西吗?

编辑: 我刚刚发现,我没有解决问题,我只是没有进行足够的测试。我开始的Activity 运行良好,直到我想用我之前开始的Activity 创建下一个Activity。在启动下一个Activity 时,我的应用再次崩溃。

【讨论】:

【参考方案3】:

参考这个问题的答案。看起来像一个已知问题,也有解决方案。 希望对你有帮助……

NullPointerException on onSaveInstanceState with AndroidFragments

【讨论】:

可能有关系,但这个问题早于 Fragments。【参考方案4】:

向 Android 项目报告错误如何(要求检查是否有其他人报告)?如果堆栈跟踪中没有来自 You 的代码,则表明框架中存在错误。虽然可能在你的其他代码中你打破了例如不言而喻的合同/假设。

【讨论】:

请将您的答案合并为一个答案。 这些答案代表了不同的方法——为什么要合并它们? @KarolDepka 您可以在其中创建标题,但将其作为单一答案更适合 ***。【参考方案5】:

也许尝试将方法 handleStopActivity 包装在 try-catch 块中并自己处理错误,为自己提供更多详细信息并防止“强制关闭”?

【讨论】:

@BenTobin 您可以查看 ActivityThread.java:3674 上的内容,它有时会给出提示。 Play 商店的错误报告是否提及 Android 版本?

以上是关于handleStopActivity 中的 NullPointerException -- 在堆栈跟踪中没有引用我的代码的主要内容,如果未能解决你的问题,请参考以下文章

如何从Java中的字符串中删除nul字符(\ 0)

列值采用 0 或 nul 代替 HIVE 中的 char 数据类型

java中的nul与空字符串与零的区别l

C++的nullptr与NUL

为啥 environment.getProperty("spring.profiles.active") 在使用 @ActiveProfiles 激活测试中的配置文件时返回 nul

如何使 Microsoft BCP 导出空字符串而不是 NUL 字符?