Vij*_*van 3 java exception try-catch-finally rethrow
对catch中抛出的异常有问题,最后阻止:
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我试过多次执行上面的代码.它每次给我不同的输出.
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)
Run Code Online (Sandbox Code Playgroud)
请解释.
Jon*_*eet 11
所有你看到的是写作System.out
和之间的竞争条件System.err
.您显式调用System.out.print
1,然后是3,然后是4,然后是2,并且异常被抛出并System.err
自动转储.所以你得到的每一个输出都是"1342",其中有异常堆栈跟踪.
实际执行流程在每种情况下都是相同的 - 它只是输出不同.为了证明这一点,你可以将整个main方法包装在写入异常的try
/ catch
block System.out
中,此时它将与所有现有的System.out
调用同步,并且没有竞争条件.