在用日志打印异常信息的时候有时候只能看到异常的名字但是并没有异常的堆栈信息.
简单说就是JVM会对异常信息优化,如果抛出的异常超过一定次数则堆栈信息就没有啦. 测试代码如下:

 public class NpeThief {
    public static void main(String... args) {
        NpeThief thief = new NpeThief();
        thief.callManyNPEInLoop();
    }

    public void callManyNPEInLoop() {
        for (int i = 0; i < 200000; i++) { //把这个数调大就会发现输出的不是2 而是0
            try {
                ((Object) null).getClass();
            } catch (Exception e) {
                // This will switch from 2 to 0 (indicating our problem is happening)
                System.out.println(e.getStackTrace().length);
                e.printStackTrace();
            }
        }
    }
 }

解决办法:
在jvm中添加参数: -XX:-OmitStackTraceInFastThrow, 或者遇到异常及时处理

参考:https://stackoverflow.com/questions/2295015/log4j-not-printing-the-stacktrace-for-exceptions


zhangbaocheng
1 声望0 粉丝