我已经有我们的Java代码的实例捕捉一个NullPointerException,但当我试图记录StackTrace(基本上最终调用Throwable.printStackTrace()),我得到的是:
java.lang.NullPointerException
有人遇到过吗?我试着在谷歌上搜索“java空指针空堆栈跟踪”,但没有遇到这样的东西。
我已经有我们的Java代码的实例捕捉一个NullPointerException,但当我试图记录StackTrace(基本上最终调用Throwable.printStackTrace()),我得到的是:
java.lang.NullPointerException
有人遇到过吗?我试着在谷歌上搜索“java空指针空堆栈跟踪”,但没有遇到这样的东西。
当前回答
下面是一个解释:Hotspot导致异常在生产中丢失堆栈跟踪-以及修复
我在Mac OS X上进行了测试
Java版本“1.6.0_26” Java(TM) SE运行时环境(build 1.6.0_26-b03-383-11A511) Java HotSpot(TM) 64位服务器虚拟机(build 20.1-b02-383,混合模式) 对象字符串= "abcd"; Int I = 0; While (i < 12289) { 我+ +; 尝试{ 整数a =(整数)字符串; } catch(异常e) { e.printStackTrace (); } }
对于这个特定的代码片段,12288次迭代(+频率?)似乎是JVM决定使用预分配异常的限制……
其他回答
另一个建议——如果您正在使用Eclipse,您可以在NullPointerException本身上设置一个断点(在Debug透视图中,转到“Breakpoints”选项卡并单击有一个!在它)
检查“caught”和“uncaught”选项-现在当你触发NPE时,你会立即断点,然后你可以逐步查看它是如何被处理的,以及为什么你没有得到堆栈跟踪。
当您在项目中使用AspectJ时,可能会发生某些方面隐藏其堆栈跟踪的部分。例如,今天我有:
java.lang.NullPointerException:
at com.company.product.MyTest.test(MyTest.java:37)
这个堆栈跟踪是在通过Maven的surefire运行测试时打印的。
另一方面,当在IntelliJ中运行测试时,会打印不同的堆栈跟踪:
java.lang.NullPointerException
at com.company.product.library.ArgumentChecker.nonNull(ArgumentChecker.java:67)
at ...
at com.company.product.aspects.CheckArgumentsAspect.wrap(CheckArgumentsAspect.java:82)
at ...
at com.company.product.MyTest.test(MyTest.java:37)
VM停止输出多次抛出的异常的堆栈跟踪。这是发生在C2编译中的优化之一。
根据OpenJDK源代码,此优化应用于以下例外情况:
nullpointerexception -ArithmeticException -ArrayIndexOutOfBoundsException -ArrayStoreException classcastexception
正如您在评论中提到的,您正在使用log4j。我(无意中)发现了一个我写过东西的地方
LOG.error(exc);
而不是典型的
LOG.error("Some informative message", e);
因为懒惰,或者可能只是没有想过。不幸的是,它的行为并不如您所期望的那样。记录器API实际上将Object作为第一个参数,而不是字符串——然后它对该参数调用toString()。因此,它没有得到漂亮的堆栈跟踪,只是打印出toString——在NPE的情况下,这是非常无用的。
也许这就是你正在经历的?
例外。toString不给你StackTrace,它只返回
这是一个简短的描述扔。 结果是: *该对象的类名 * ": "(冒号加空格) *调用该对象的getLocalizedMessage()方法的结果
使用异常。而不是printStackTrace来输出StackTrace。