【发布时间】:2010-09-29 11:32:27
【问题描述】:
如果我在这样的调用中收到 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,我知道调试器是什么,但我不知道如何将其应用于问题。
我对答案的结论:
一些答案告诉我,我不应该一个接一个地链接 getter,一些答案告诉我如果我不遵守该建议,如何调试我的代码。
我接受了一个答案,该答案教会了我何时链式吸气剂:
- 如果它们不能返回 null,只要你喜欢就可以链接它们。无需检查 != null,无需担心 NullPointerExceptions(请注意,链接仍然违反 Demeter 法则,但我可以忍受)
- 如果它们可能返回 null,请永远不要链接它们,并检查每个可能返回 null 的 null 值
这使得任何关于实际调试的好建议都毫无用处。
【问题讨论】:
-
现在我看到这可能是两个单独的问题:1. 使用链式 getter 时如何避免 NPE,2. 如果我没有避免 NPE,我该如何追踪问题。我很高兴这两个问题都得到了很好的答案,但是很难选择接受哪个答案。
标签: java debugging nullpointerexception getter