exception不打印堆栈信息

不出现堆栈信息情况

1.使用问题

1
log.error("xxxxx{}", e.message());

应使用

1
log.error("xxxx", e);
  1. jvm的优化(fast throw)

白话一点来说,就是:当一些异常类型(空指针、下标越界、算术运算等…)在代码里的固定位置被抛出多次,虚拟机(HotSpot VM)会直接 抛出一个事先分配好、类型匹配的异常对象。此异常对象的 message 和 stack trace 都为空

就是因为某一个异常在同一个地方多次被抛出,JVM 抛出一个预分配异常,那么 message、stack trace 相当于被吞掉了

JDK 1.5 的发布文档介绍中描述了此情况,出现这种优化方案的原因是 为了提高性能。当同一种异常在相同的位置被抛出多次,编译器就会重新编译此方法。重编译后,编译器可能会 使用不提供堆栈跟踪的预分配异常 来选择更快的策略。

可以使用 -XX:-OmitStackTraceInFastThrow关闭这种预分配异常的机制。

Fast throw 机制支持的五种异常情况:

空指针异常

算术异常

数组下标越界异常

arrayStoreException

classCastException

验证:

1
2
3
4
5
6
7
8
9
List<String> list = new ArrayList();
for (int j = 0; j < 10000; j++) {
try {
list.get(-1);
} catch (Exception ex) {
int length = ex.getStackTrace().length;
System.out.println(String.format("报错异常 :: %s, 堆栈长度 :: %s", ex, length));
}
}

exception不打印堆栈信息
http://hanqichuan.com/2022/06/08/java/exception不打印堆栈信息/
作者
韩启川
发布于
2022年6月8日
许可协议