现在的位置: 首页 > 综合 > 正文

Throwable.fillInStackTrace

2013年10月06日 ⁄ 综合 ⁄ 共 1202字 ⁄ 字号 评论关闭

Throwable.fillInStackTrace本是一个 synchronized native 方法,其如下: 

    /**
     * Fills in the execution stack trace. This method records within this
     * <code>Throwable</code> object information about the current state of
     * the stack frames for the current thread.
     *
     * 在 Throwable 对象中 填充 执行堆栈信息。此方法在 Throwable 对象中 记录 当前线程的栈帧的 当前状态信息
     *
     * @return  a reference to this <code>Throwable</code> instance.
     * @see     java.lang.Throwable#printStackTrace()
     */
    public synchronized native Throwable fillInStackTrace();

当抛出此异常时,就会通过这个方法填充当前线程的栈帧信息。如果,我们重新了此方法(native实现是将线程的栈帧信息记录到此 Throwable 对象中),不记录当前线程的栈帧信息,那么,当此异常被抛出时,就无法保存堆栈信息了
测试代码如下:

package marvin.doit.exception_cause_low_performance;

public class JustForDemoException extends RuntimeException {
	private static final long serialVersionUID = 2134186859756705446L;

	@Override
	public Throwable fillInStackTrace() {
		return this;
	}

	private static void method1() {
		System.out.println("in method 1");
		method2();
	}

	private static void method2() {
		System.out.println("in method 2");
		method3();
	}

	private static void method3() {
		System.out.println("in method 3");
		method4();
	}

	private static void method4() {
		System.out.println("in method 4");
		throw new JustForDemoException();
	}

	public static void main(String[] args) {
		method1();
	}

}

注意:上面代码中,我们覆写了 fillInStackTrace(),执行后,我们得到如下结果:

不要覆写(就想我们平时作的那样,平时谁会去覆写这个方法啊)。一切正常,我们又看到了常见的 堆栈信息

抱歉!评论已关闭.