【问题标题】:How can I debug this NullPointer exception?如何调试此 NullPointer 异常?
【发布时间】:2009-08-01 20:41:15
【问题描述】:

我正在尝试为 Android 编写一个应用程序,当我启动我的新活动时,我设置了断点,发现它通过我的 onCreate 运行没有任何错误,但在该函数返回后,调试器说有NullPointer 异常 (NPE)。问题是,它不在我的代码中,它在 ActivityThread.performLaunchActivity(ActivityThread$ActivityRecord) 行中说:2268 并且源通常在哪里(如果它是我的代码)我只是得到“找不到源”。和一个显示“编辑源查找路径”的按钮。

如何设置 Eclipse 以便调试此问题?我确定我的代码有问题,但由于异常源自我看不到的代码,我不知道如何找出问题所在。

我在这个项目中使用 android-sdk-linux_x86-1.5_r3 和我的 G1。

我认为我的问题确实与 Android 开发有关,而不是使用 Eclipse。我不确定在哪里可以找到引发异常的代码的来源。也许有一种方法可以在没有该文件的情况下调试它,但我不确定它会是什么。

【问题讨论】:

    标签: android eclipse


    【解决方案1】:

    我自己也想知道这一点,尽管它在 LogCat 中显示了“由”,但我希望调试器真正中断引发 NullPointer 异常的位置(即使它被捕获)。

    方法如下:

    1. 运行 -> 添加 Java 异常断点
    2. 查找 NullPointerException(或您可能正在调试的任何其他内容(“Caused by”异常))
    3. 确保选中Suspend On Caught Exceptions。点击确定
    4. 您应该会在视图中看到一个新断点

    现在尝试运行它,调试器应该会在实际发生的地方中断。

    【讨论】:

    • OMFG,如果可以的话,我会支持你 100 次。这确实挽救了我的理智,我正试图找出我的 NPE 实际发生在哪里。
    • 这段文字完全保存了我的一天,这对于那些非常棘手的例外非常有用!点赞,点赞!
    • 你@mikelikespie 先生,是英雄!
    • 迈克,你太棒了。有人给这个英雄一个馅饼:D
    【解决方案2】:

    您的假设应该是 NPE 是由您造成的,而不是 Android。 NPE 可能会在ActivityThread.performLaunchActivity(ActivityThread$ActivityRecord) line: 2268 处弹出,但这意味着您将空指针传递给了某个东西,并且它一直在传递,直到performLaunchActivity 实际尝试使用它并在找到空指针时崩溃。

    如果我们可以看到完整的 LogCat,尤其是 Eclipse LogCat 中的所有红色内容,它将有助于调试。我已经把自己翻过来寻找一个 NPE,只是为了让其他人找到一个非常微妙的资源初始化行。

    【讨论】:

    • 谢谢。堆栈似乎对我没有帮助,但如果我查看 LogCat,它会告诉我我的代码在哪里进行交互,并且能够准确地告诉我我的问题在哪里。
    • 我还得再做一件事。每个人都可能会这样做,但没有在这里喊出来,我一直在浪费时间。 "确保您继续在 eclipse/debugger 中继续运行,直到在 LogCat 中看到上述错误"
    • “Resuming”对我有用,谢谢。总是很困惑,因为我永远不会看到堆栈跟踪(“由:”)永远不会出现。
    【解决方案3】:

    一个显示“编辑源查找路径”的按钮

    点击该按钮并告诉 Eclipse 在哪里可以找到该方法的源代码。那应该有帮助。至少您将能够在调试器中单步执行它并阅读更明智的内容。

    【讨论】:

      【解决方案4】:

      通常,至少在 Android 中,一个异常会触发两个单独的跟踪。第一个没用。第二个,用“Caused by exception”注明,是你想要的。

      而且,即使堆栈跟踪都没有您的代码,我们也可以通过查看整个内容来识别某些内容。

      【讨论】:

        【解决方案5】:

        我没有使用过 Android,但 Eclipse 应该能够向您显示调用堆栈。

        查看程序退出您的代码并进入其他人的代码的点,并确保您的所有变量都正确(非空、包含“正确”数据等)。

        【讨论】:

        • 我的代码都没有在调用堆栈中。我的代码在 android 中运行,所以似乎 android 期望我设置一些东西,但我不确定如何找到那个东西。
        • 那么您是否有机会复制和粘贴异常以及调用堆栈的前几行?此外,如果您可以尝试用最少的代码重现异常,这可能会有所帮助(删除程序中重现问题所不需要的所有内容,并发布剩余的代码 - 只要代码不是专有的) .熟悉 Android 的人可能能够使用该代码找出问题所在,或者 Google 的某个人可能能够在您消除所有无关数据时帮助诊断......我很抱歉,我没有更好的帮助,到目前为止...
        【解决方案6】:

        即使它发生在 Android 代码中,您仍然应该能够缩小它发生的时间点以及它不喜欢哪些变量。是啊,含糊的回答,没什么好说的。或者下载源代码并告诉 Eclipse 它在哪里。

        【讨论】:

          【解决方案7】:

          如果你想在不下载 Android 源代码的情况下查看异常发生的位置,有一个不错的plugin for eclipse called GrepCode。在线搜索和展示热门java项目的源代码。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-24
            • 1970-01-01
            • 2010-10-15
            • 2019-04-11
            相关资源
            最近更新 更多