在 http://blog.youkuaiyun.com/iceman1952/article/details/8230804(Throwable.fillInStackTrace) 中,我们知道,Exception 中的 stack trace 其实是在 new 此Exception() 时,通过 fillInStackTrace() 方法填充到 此新new出来的异常中的。我们也知道,异常的耗时其实在于 create(而不是 throw)。那么,如果,我们 new 一个共用的异常,每次要抛异常时,将其抛出,这样可以不?
答案是:不可以
正是在 new Exception() 时,填充当前线程(new 这个Exception 的线程)的 栈帧信息,如果你抛出 共用的 异常,则:此共用异常 包含的 栈帧信息是 原来 create 此异常时的线程的栈帧信息(而不是将要 抛异常的线程 的当前的栈帧信息)
package marvin.doit.exception_cause_low_performance;
public class UseCommonException {
private RuntimeException e;
public void createE() {
e = new RuntimeException(Thread.currentThread().getName());
}
public RuntimeException getE() {
return e;
}
public static void main(String[] args) throws Exception {
final UseCommonException uce = new UseCommonException();
uce.createE();
Thread t = new Thread() {
@Override
public void run() {
beCalled();
}
public void beCalled() {
throw uce.e;
}
};
t.start();
}
}
结果如下: