java – 在finally和catch块中抛出异常
发布时间:2020-12-15 04:48:34 所属栏目:Java 来源:网络整理
导读:对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中抛出的异常有问题,最后阻止:
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块中,该块将异常写入System.out,此时它将与所有现有的System.out调用同步,并且没有竞争条件. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |