异常是怎么组装stackTrace的

在异常类被创建初始化的时候就会将调用栈填入父类Throwable的stackTrace。

public Throwable() {
        fillInStackTrace();
}

以上代码是Throwable的构造方法,所以异常在初始化的时候均会调用

public synchronized Throwable fillInStackTrace() {
        if (stackTrace != null ||
            backtrace != null /* Out of protocol state */ ) {
            fillInStackTrace(0);
            stackTrace = UNASSIGNED_STACK;
        }
        return this;
}
    
private native Throwable fillInStackTrace(int dummy);

fillInStackTrace调用后就会将调用栈放入stackTrace 。

所以异常只能独有不能共享,每一次都要new一个。如果需要用工厂方法来统一的创建异常,也需要每一次都new一个异常,否则stackTrace必然出现异常情况。

你可能感兴趣的:(java基础)