今天测试环境遇到一个奇怪的问题,日志中报出的异常仅有异常信息,没有堆栈信息
这肯定是有问题的,首先排查是不是log4j使用错了,去代码层看到直接抛得异常,没有打印,全局异常处理器里写的log.error("url{} error{}",url,e)这里看起来也是正常的
那也有可能是ssh的工具问题,我把文件拿下来本地查看了下,发现确实是少了堆栈信息,用关键字全局搜索存在过去的相同异常有堆栈信息,看起来像是java自己的骚操作
这就很优秀了。google 了一下,找到了答案,毕竟创建新的异常实例是很消耗性能的,所以1.5以后java对此进行了优化,如果重复多次抛出一个异常的时候对这个逻辑优化
仅仅抛出异常信息,不再构造堆栈信息了。
下面是测试,
public static void test() { String l = null; l.equals(""); try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } public static void main(String[] args) throws InterruptedException { int i = 1; while (i <= 10000) { try { test(); } catch (Exception e) { e.printStackTrace(); if (e.getStackTrace().length == 0) { System.out.println("已经优化了" + i); return ; } } i++; } }
结果如下
这时就已经没有堆栈信息了,仅有一个异常信息