调试nullPointerException的好方法

我在java中使用eclipse和编程。 有时我遇到一个会让我困扰几个小时的nullPointerException。 无论如何,更好地调试nullPointerExceptions并找出哪些变量值和其他会导致空指针exception的事情。

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

 x.getValue() 

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

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

抛出

NullPointerException – 如果targetreplacementnull

它没有比那更清楚!

这是一个例子:

在此处输入图像描述

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

在此处输入图像描述

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

在此处输入图像描述

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

  1. 调试时可以使用BreakPoints视图捕获空指针。

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

    在视图中有一个"J!" 允许您在exception上设置断点。 您可以设置java.lang.NullPointerException 。 因此,一旦抛出空指针exception,您就可以检查哪个变量导致null。

  2. 您可以做的其他事情是在编码时捕获可能的空指针访问。 当然,您无法使用此设置捕获所有Null指针。 但仍然有用,在日食中设置以下设置。

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

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

  1. 使用@Nullable注释 。

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

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

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

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

经过大量编程后,您会发现NullPointerException的数量会下降。