调试nullPointerException的好方法

时间:2013-07-26 02:15:29

标签: java debugging nullpointerexception

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

3 个答案:

答案 0 :(得分:24)

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

x.getValue()

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

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

  

<强>抛出

     

NullPointerException - 如果targetreplacementnull

它没有比那更清楚!

以下是一个例子:

enter image description here

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

enter image description here

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

enter image description here

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

答案 1 :(得分:17)

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

      

    窗口 - &gt;显示视图 - &gt;断点

    在视图中有一个"J!",可让您设置断点 例外。您可以设置java.lang.NullPointerException。一次 抛出空指针异常,您可以检查导致的变量 空。

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

      

    偏好设置 - &gt; Java - &gt;编译器 - &gt;错误/警告 - &gt;空分析

答案 2 :(得分:4)

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

  1. 使用@Nullable annotation

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

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

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

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

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