Java StackTrace不显示行中的实际null

时间:2015-03-25 15:41:56

标签: java jvm bytecode

以下例外:

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

从代码抛出:

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

因此,从堆栈跟踪中不清楚哪个元素实际上是null。有没有一种方法可以在没有调试的情况下找到它? 也许其他一些JVM会做什么?

3 个答案:

答案 0 :(得分:6)

不,你无法弄清楚

中的哪些被叫者
Object o = obj.getObj().getObj().getObj().getObj();

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

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

因此。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

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();