代码之家  ›  专栏  ›  技术社区  ›  Asa Ayers

如何调试此空指针异常?

  •  13
  • Asa Ayers  · 技术社区  · 15 年前

    我正在尝试为Android编写一个应用程序,当我启动新的活动时,我设置了断点,发现它在我的onCreate中运行,没有任何错误,但在该函数返回后,调试器说存在空指针异常。问题是,它不在我的代码中,它在activitythread.performlaunchaactivity(activitythread$activityrecord)行中表示它在activitythread.performlaunchaactivity:2268,如果它是我的代码,我只会得到“找不到源”。还有一个按钮显示“编辑源查找路径”

    如何设置Eclipse以便调试此问题?我确信我在代码中做了一些错误的事情,但是由于异常源于我看不见的代码,我不知道如何找出问题所在。

    我正在为这个项目使用android-sdk-linux_x86-1.5_r3和我的g1。

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

    7 回复  |  直到 13 年前
        1
  •  3
  •   Will Ganeshgm7    15 年前

    你的假设应该是NPE是由你引起的,而不是Android。NPE可能在 ActivityThread.performLaunchActivity(ActivityThread$ActivityRecord) line: 2268 但这意味着你向某个东西传递了一个空指针,它一直被传递到 performLaunchActivity 实际尝试使用它,但在找到空指针时崩溃。

    如果我们能看到完整的logcat,特别是Eclipselogcat中所有红色的内容,它将有助于调试。我把自己翻了个底朝外寻找一个NPE,只是为了让其他人找到一个非常微妙的资源来初始化行。

        2
  •  55
  •   mikelikespie    15 年前

    我自己也在想这个问题,尽管它在logcat中显示了“caused-by”,但我希望调试器实际中断nullpointer被抛出的位置(即使它被捕获了)。

    以下是如何:

    1. 添加Java异常断点
    2. 查找NullPointerException(或您可能正在调试的其他内容)(“由”异常引起)
    3. 确保选中了“在捕获的异常上挂起”。单击确定。
    4. 您应该在视图中看到一个新的断点

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

        3
  •  2
  •   duffymo    15 年前

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

    点击那个按钮,告诉Eclipse在哪里可以找到该方法的源代码。这应该有帮助。至少您可以在调试器中单步执行它,并阅读一些更明智的东西。

        4
  •  2
  •   CommonsWare    15 年前

    你能显示完整的调用堆栈吗?

    通常,至少在Android中,异常会触发两个独立的跟踪。第一个没用。第二个,由“异常引起的”,是你想要的那个。

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

        5
  •  1
  •   atk    15 年前

    我没有和Andriod合作过,但是Eclipse应该能够向您显示调用堆栈。查看程序退出代码并输入其他人的代码的位置,确保所有变量都正确(非空,包含“正确”数据等)。

        6
  •  0
  •   Rob Lourens    15 年前

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

        7
  •  0
  •   Marvin    13 年前

    如果您想在不下载Android源代码的情况下查看异常发生的位置,有一个很好的 plugin for eclipse called GrepCode . 它搜索并显示在线流行的Java项目的源代码。