我已经有我们的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决定使用预分配异常的限制……

其他回答

我们在过去看到过同样的行为。事实证明,由于某些疯狂的原因,如果在使用Log一段时间后,NullPointerException在代码中的同一位置多次出现。error(String, Throwable)将停止包含全堆栈跟踪。

再往前看看你的日志。你可能会找到罪魁祸首。

编辑:这个bug听起来是相关的,但它在很久以前就被修复了,这可能不是原因。

VM停止输出多次抛出的异常的堆栈跟踪。这是发生在C2编译中的优化之一。

根据OpenJDK源代码,此优化应用于以下例外情况:

nullpointerexception -ArithmeticException -ArrayIndexOutOfBoundsException -ArrayStoreException classcastexception

另一个建议——如果您正在使用Eclipse,您可以在NullPointerException本身上设置一个断点(在Debug透视图中,转到“Breakpoints”选项卡并单击有一个!在它)

检查“caught”和“uncaught”选项-现在当你触发NPE时,你会立即断点,然后你可以逐步查看它是如何被处理的,以及为什么你没有得到堆栈跟踪。

下面是一个解释: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决定使用预分配异常的限制……

toString()只返回异常名称和可选消息。我建议你打电话

exception.printStackTrace()

要转储消息,或者如果你需要血腥的细节:

 StackTraceElement[] trace = exception.getStackTrace()