Exception的堆栈信息,也有可能根本就不是出错时的调用情况

在 http://blog.csdn.net/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();
	}
}

结果如下:

Exception的堆栈信息,也有可能根本就不是出错时的调用情况_第1张图片

你可能感兴趣的:(Exception的堆栈信息,也有可能根本就不是出错时的调用情况)