Java StackTrace 不显示行中的实际空值在哪里

Java StackTrace does not show where is the actual null in the line

以下异常:

Exception in thread "main" java.lang.NullPointerException
at javaapplication7.App.main(App.java:8)
Java Result: 1

从代码中抛出:

Object o = n1.getObj().getObj().getObj().getObj();

所以从堆栈跟踪来看,并不清楚哪个元素实际上是空的。有没有不调试就可以查出来的方法? 也许其他 JVM 可以?

您可以拆分代码,以便查看 NullPointerException 发生的位置

MyObject obj0 = obj.getObj0();
MyObject obj1 = obj0.getObj1();
MyObject obj2 = obj1.getObj2();
MyObject obj3 = obj2.getObj3();

不,您无法确定

中的哪个被调用者
Object o = obj.getObj().getObj().getObj().getObj();

通过查看堆栈跟踪导致 NullPointerException。通常建议将您的代码格式化为

Object o = obj.getObj()
              .getObj()
              .getObj()
              .getObj();

出于这个原因。

因为他们都站在同一条线上

Object o = obj.getObj0().getObj1().getObj2().getObj3();

您不能期望其中之一的行号不同。

就我个人而言,为了省事,我会将它们分开并检查空值,如果可能的话。

MyObject obj0 = obj != null ? obj.getObj0() : null;
MyObject obj1 = obj0 != null ? obj.getObj1() : null;
MyObject obj2 = obj1 != null ? obj.getObj2() : null;
MyObject obj3 = obj2 != null ? obj.getObj3() : null;

如果你真的想使用链接,那么你应该格式化它,这样每次调用都在不同的行上,以避免这种情况。

Object o = n1.getObj()
           .getObj()
           .getObj()
           .getObj();