我目前正在学习java中的异常,并编写了一个带有链式异常的测试类,用于打印堆栈跟踪。然而,结果让我对执行的顺序感到困惑。我已经运行了好几次,并得到了不同的输出。
这是班级:
public class Test {
private static void foo() {
try {
System.out.println("foo try");
bar();
} catch (Exception e) {
System.out.println("foo catch - "+e.getMessage()+", cause: "+e.getCause());
StackTraceElement elements[] = e.getStackTrace();
for (int i = 0, n = elements.length; i < n; i++) {
System.err.println(elements[i].getFileName()
+ ":" + elements[i].getLineNumber()
+ ">> "
+ elements[i].getMethodName() + "()");
}
} finally {
System.out.println("foo finally");
}
}
private static void bar() throws Exception {
try {
System.out.println("bar try");
int[] a = new int[10];
System.out.println(a[10]);
// Never reached
} catch (IndexOutOfBoundsException e) {
System.out.println("bar catch - "+e.getMessage());
throw new Exception("Chained exception", e);
} finally {
System.out.println("bar finally");
}
}
public static void main(String args[]) {
foo();
}
}
在IntelliJ中为我生成了以下输出:
如何在抛出异常之前显示异常?如何在堆栈跟踪的元素之间进行其他语句 - 它们的执行顺序是什么?据我所知,堆栈跟踪最后应打印出来。