我正在使用 eclipse 和 java 编程。有时我会遇到一个会困扰我几个小时的 nullPointerException。无论如何可以更好地调试 nullPointerExceptions 并找出变量值是什么以及其他会导致空指针异常的事情。
3 回答
查看堆栈跟踪并读取NullPointerException
抛出的行号。几乎总是,该行有一些方法调用,如
x.getValue()
如果x
是null
,你会得到一个NullPointerException
. 如果堆栈跟踪顶部的方法不是您的代码,请一直跟踪堆栈,直到您到达您的代码。在这种情况下,您通常会传递null
给不喜欢null
参数的方法。找到它并修复它。
此外,当您遇到不属于您的方法时,通常会抛出 a NullPointerException
,请阅读文档。例如,看String.replace(CharSequence target, CharSequence replacement)
:
抛出:
NullPointerException
-如果target
或是replacement
。null
没有比这更清楚的了!
这是一个例子:
查看第 4 行,我们看到foo.bar()
. 这意味着foo
是null
。那很容易。让我们看另一个例子:
追溯到您的代码,我们看到这s.replace(target, replacement)
是在抛出。我们应该检查target
和replacement
。让我们附加一个调试器:
啊哈!replacement
是null
。您可以在 Eclipse 中做同样的事情。在抛出异常时设置断点,并使用它来检查方法的参数。我在这里很原始,因为我来自一个思想流派,我真诚地相信,如果每个人都先学会以艰难的方式去做,就会变得更好。泄漏的抽象和所有这些。
在调试时,您可以使用
BreakPoints
视图来捕获空指针。窗口 -> 显示视图 -> 断点
在视图中有一个
"J!"
可以让您在异常上设置断点。你可以设置java.lang.NullPointerException
. 因此,一旦抛出空指针异常,您可以检查哪个变量导致空值。您可以做的另一件事是在编码时捕获可能的空指针访问。偏离路线,您无法使用此设置捕获所有空指针。但它仍然很有帮助,请在您的 Eclipse 中设置以下设置。
首选项 -> Java -> 编译器 -> 错误/警告 -> 空分析
有几种方法可以NullPointerException
减少问题:
使用@Nullable 注释。
null
测试构造函数和 setter中的参数值(避免使用普通的旧 Java 代码中的 setter)。如果你经常这样做,你可以制作一个(Eclipse)源代码模板来快速生成代码。这称为“failfast”——当值在代码中被进一步使用时,例如在将其存储在字段中之后,您不必等待抛出异常。确保每行执行最少数量(例如 1 或 2)的操作。如果你不这样做,你将不得不找出单行表达式中
NullPointerException
发生的位置。不要
null
在字段中使用来指示状态。相反,请使用例如enum State
. 例如,不要这样做if (socket == null) { // not connected }
,因为这很容易忘记null
稍后检查。明确的状态不是那么容易忘记的。null
除非明确需要,否则不要将局部变量初始化为。实际上,如果您正确处理范围和异常,您应该能够标记大多数变量final
。用 help 替换默认printStacktrace()
方法,throw new IllegalStateException("Unhandled program state", e)
因为它被视为代码块的退出点。
经过大量编程后,您会发现NullPointerException
s 的数量减少了。