最近有多次发现项目的log日志中有很多奇怪的异常:
Java ArrayIndexOutOfBoundsException: null
一般异常信息应该是:
Java ArrayIndexOutOfBoundsException: -1
开始没太注意,后来多次碰到后觉得这样下去不是办法,上线后还出现这种问题那就麻烦大了,所以决定今天已经要解决掉。
为了什么会有null的信息呢,后面调试发现,第一次执行都是完整的很长的堆栈信息,但相同位置出现第二次异常时,堆栈就很短,而且e.getMessage()返回null,我以为是我jdk版本升级到1.7的原因(怀疑最近JDK对异常做了优化),切换到1.6还是出现这种情况,后来在网上找了很多答案,终于找到了确切原因,那就是JIT对循环内的异常堆栈进行了优化。
原文:http://stackoverflow.com/questions/6538792/why-does-throwable-getmessage-occasionally-return-null
Found the answer on a similar question.
The JIT compiler will optimize away stack traces in certain exceptions if they happen enough.
The JVM flag -XX:-OmitStackTraceInFastThrow prevents this behavior and seems to fix the flickering unit tests.