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();
	}
}

结果如下:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值