23

我正在使用 eclipse 和 java 编程。有时我会遇到一个会困扰我几个小时的 nullPointerException。无论如何可以更好地调试 nullPointerExceptions 并找出变量值是什么以及其他会导致空指针异常的事情。

4

3 回答 3

33

查看堆栈跟踪并读取NullPointerException抛出的行号。几乎总是,该行有一些方法调用,如

x.getValue()

如果xnull,你会得到一个NullPointerException. 如果堆栈跟踪顶部的方法不是您的代码,请一直跟踪堆栈,直到您到达您的代码。在这种情况下,您通常会传递null给不喜欢null参数的方法。找到它并修复它。

此外,当您遇到不属于您的方法时,通常会抛出 a NullPointerException,请阅读文档。例如,看String.replace(CharSequence target, CharSequence replacement)

抛出

NullPointerException-如果target或是replacementnull

没有比这更清楚的了!

这是一个例子:

在此处输入图像描述

查看第 4 行,我们看到foo.bar(). 这意味着foonull。那很容易。让我们看另一个例子:

在此处输入图像描述

追溯到您的代码,我们看到这s.replace(target, replacement)是在抛出。我们应该检查targetreplacement。让我们附加一个调试器:

在此处输入图像描述

啊哈!replacementnull。您可以在 Eclipse 中做同样的事情。在抛出异常时设置断点,并使用它来检查方法的参数。我在这里很原始,因为我来自一个思想流派,我真诚地相信,如果每个人都先学会以艰难的方式去做,就会变得更好。泄漏的抽象和所有这些。

于 2013-07-26T02:18:34.443 回答
18
  1. 在调试时,您可以使用BreakPoints视图来捕获空指针。

    窗口 -> 显示视图 -> 断点

    在视图中有一个"J!"可以让您在异常上设置断点。你可以设置java.lang.NullPointerException. 因此,一旦抛出空指针异常,您可以检查哪个变量导致空值。

  2. 您可以做的另一件事是在编码时捕获可能的空指针访问。偏离路线,您无法使用此设置捕获所有空指针。但它仍然很有帮助,请在您的 Eclipse 中设置以下设置。

    首选项 -> Java -> 编译器 -> 错误/警告 -> 空分析

于 2013-07-26T02:35:36.130 回答
4

有几种方法可以NullPointerException减少问题:

  1. 使用@Nullable 注释

  2. null测试构造函数和 setter中的参数值(避免使用普通的旧 Java 代码中的 setter)。如果你经常这样做,你可以制作一个(Eclipse)源代码模板来快速生成代码。这称为“failfast”——当值在代码中被进一步使用时,例如在将其存储在字段中之后,您不必等待抛出异常。

  3. 确保每行执行最少数量(例如 1 或 2)的操作。如果你不这样做,你将不得不找出单行表达式中NullPointerException发生的位置。

  4. 不要null在字段中使用来指示状态。相反,请使用例如enum State. 例如,不要这样做if (socket == null) { // not connected },因为这很容易忘记null稍后检查。明确的状态不是那么容易忘记的。

  5. null除非明确需要,否则不要将局部变量初始化为。实际上,如果您正确处理范围和异常,您应该能够标记大多数变量final。用 help 替换默认printStacktrace()方法,throw new IllegalStateException("Unhandled program state", e)因为它被视为代码块的退出点。

经过大量编程后,您会发现NullPointerExceptions 的数量减少了。

于 2013-07-26T02:27:53.320 回答