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