在Java中,构造异常对象是”十分”耗时的,其原因是在默认情况下,创建异常对象时会调用父类Throwable
的fillInStackTrace()
方法生成栈追踪信息,JDK中的源码如下:
public synchronized Throwable fillInStackTrace() {
if (stackTrace != null ||
backtrace != null /* Out of protocol state */ ) {
fillInStackTrace(0); // native方法
stackTrace = UNASSIGNED_STACK;
}
return this;
}
在我自己做的测试中,new
一个带有栈追踪信息的Exception
对象要比创建不带追踪信息的对象慢50倍以上。虽然打印调用栈能够精确定位到错误发生的