加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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调用同步,并且没有竞争条件.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读