对 catch 和 finally block 中抛出的异常有疑问:
class MyExc1 extends Exception {}
class MyExc2 extends Exception {}
class MyExc3 extends MyExc2 {}
public class C1 {
public static void main(String[] args) throws Exception {
try {
System.out.print(1);
q();
}
catch (Exception i) {
throw new MyExc2();
}
finally {
System.out.print(2);
throw new MyExc1();
}
}
static void q() throws Exception {
try {
throw new MyExc1();
}
catch (Exception y) {
System.out.print(3);
}
finally {
System.out.print(4);
throw new Exception();
}
}
}
我曾多次尝试执行上述代码。它每次都会给我不同的输出。
output 1: 1Exception in thread "main" 342test.MyExc1
at test.C1.main(C1.java:18)
output 2: 1342Exception in thread "main" test.MyExc1
at test.C1.main(C1.java:18)
output 3: 1Exception in thread "main" test.MyExc1
342 at test.C1.main(C1.java:18)
output4: 1Exception in thread "main" 34test.MyExc1
2 at test.C1.main(C1.java:18)
请解释。
最佳答案
您所看到的只是写入 System.out
和 System.err
之间的竞争条件。您明确调用 System.out.print
1,然后是 3,然后是 4,然后是 2,异常被抛出并自动转储到 System.err
。所以你得到的每个输出都是“1342”,其中某处有异常堆栈跟踪。
实际执行流程在每种情况下都是相同的 - 只是不同的输出。为了证明这一点,您可以将整个 main 方法包装在 try
/catch
block 中,该 block 将异常写入 System.out
,此时它将与所有现有的 System.out
调用同步,并且不会出现竞争条件。
关于java - 最后抛出异常并捕获 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41160801/