如果我在这样的调用中收到 NullPointerException:
someObject.getSomething().getSomethingElse().
getAnotherThing().getYetAnotherObject().getValue();
我收到一个相当无用的异常文本,例如:
Exception in thread "main" java.lang.NullPointerException
at package.SomeClass.someMethod(SomeClass.java:12)
我发现很难找出哪个调用实际上返回了 null,经常发现自己将代码重构为如下所示:
Foo ret1 = someObject.getSomething();
Bar ret2 = ret1.getSomethingElse();
Baz ret3 = ret2.getAnotherThing();
Bam ret4 = ret3.getYetAnotherOject();
int ret5 = ret4.getValue();
然后等待更具描述性的 NullPointerException 告诉我要查找哪一行。
你们中的一些人可能会认为串联 getter 是不好的风格,无论如何都应该避免,但我的问题是:我可以在不更改代码的情况下找到错误吗?
提示:我正在使用 eclipse 并且我知道调试器是什么,但我不知道如何将其应用于问题。
我对答案的结论:
一些答案告诉我,我不应该一个接一个地链接吸气剂,一些答案告诉我,如果我不遵守该建议,如何调试我的代码。
我已经接受了一个答案,它教会了我何时链接吸气剂:
- 如果它们不能返回 null,则可以将它们链接起来,只要您愿意。无需检查 != null,无需担心 NullPointerExceptions (请注意,链接仍然违反了得墨忒耳定律,但我可以接受)
- 如果它们可能返回 null,则永远不要链接它们,并对每个可能返回 null 的值执行 null 值检查
这使得任何关于实际调试的好的建议都毫无用处。
NPE 是 Java 中最无用的异常。它似乎总是被懒惰地实现,并且从不确切地说明导致它的原因,即使像“class x.y.Z is null”这样简单也会对调试此类情况有很大帮助。
无论如何,我发现在这些情况下找到 NPE 抛出者的唯一好方法是以下类型的重构:
someObject.getSomething()
.getSomethingElse()
.getAnotherThing()
.getYetAnotherObject()
.getValue();
现在你已经知道了,现在 NPE 指向正确的线,从而正确的方法抛出了实际的 NPE。不像我想要的那样优雅的解决方案,但它有效。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)