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