做了一些实验,目前看是会把
-> 异常处理当前桢里
-> 指定异常类的任意实例(可以不是被抛出的实例)
-> 的第一次引用操作(如:astore,aload,athrow,pop,pushstatic,getstatic)
-> 及递归其Subroutine调用链上的
-> 每一桢的第一次引用操作的 Excution Point,记录到堆栈元素数组里
根据原题代码做简单修改:
package playground;
class SysException extends Exception {
public static final SysException SYSTEM_EXCEPTION = new SysException(100001);
private int errorCode;
public SysException(int errorCode) {
this.errorCode = errorCode;
}
}
public class ExceptionTest {
static SysException bla() {
try {
new ExceptionTest().bla(123);
throw new SysException(131);
} catch (SysException e) {
return e;
}
}
private SysException bla(int x) {
return new SysException(x);
}
public static void main(String[] args) {
bla();
SysException ex = SysException.SYSTEM_EXCEPTION;
try {
test1();
} catch (Exception e) {
e.printStackTrace();
}
try {
test2();
} catch (Exception e) {
e.printStackTrace();
}
}
private static void test1() throws SysException {
throw SysException.SYSTEM_EXCEPTION;
}
private static void test2() throws SysException {
throw SysException.SYSTEM_EXCEPTION;
}
}
会有如下的输出结果
playground.SysException
at playground.SysException.(ExceptionTest.java:4)
at playground.ExceptionTest.bla(ExceptionTest.java:23)
at playground.ExceptionTest.bla(ExceptionTest.java:15)
at playground.ExceptionTest.main(ExceptionTest.java:27)
playground.SysException
at playground.SysException.(ExceptionTest.java:4)
at playground.ExceptionTest.bla(ExceptionTest.java:23)
at playground.ExceptionTest.bla(ExceptionTest.java:15)
at playground.ExceptionTest.main(ExceptionTest.java:27)
可尝试继续修改代码,观察输出(比如交换 15~16 行的实例)。
另外,可调用 e.fillInStackTrace() 来更新 private stackTrace
最后建议,除非有不关注堆栈的业务错误,避免使用单例异常。