为了账号安全,请及时绑定邮箱和手机立即绑定

在catch和finally子句中引发异常

在catch和finally子句中引发异常

慕妹3242003 2019-10-15 13:58:58
在大学里一个关于Java的问题中,有以下代码片段: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) {        }        finally {            System.out.print(3);            throw new Exception();        }    }}我被要求提供其输出。我回答了13Exception in thread main MyExc2,但是正确答案是132Exception in thread main MyExc1。怎么会这样 我只是不明白MyExc2去哪了。
查看完整描述

3 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

基于阅读您的答案并了解您可能的想法,我相信您认为“进行中的例外”具有“优先权”。记住:

当新的异常被抛出在catch块中或将要传播到该块之外的finally块中时,当前的异常将被中止(并被遗忘),因为新的异常向外传播。与其他任何异常一样,新异常开始释放堆栈,退出当前块(catch或finally块),并在此过程中受到任何适用的catch或finally块的约束。

请注意,适用的catch或finally块包括:

当在catch块中引发新异常时,新异常仍受该catch的finally块(如果有)的影响。

现在,请回溯执行过程,并记住,每当您单击时throw,都应中止跟踪当前异常并开始跟踪新异常。


查看完整回答
反对 回复 2019-10-15
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

即使从try / catch块中的任何位置抛出异常,都将执行finally子句。

由于它是在中执行的最后一个,main并且会引发异常,因此调用者会看到该异常。

因此,确保该finally子句不抛出任何内容的重要性,因为它会吞噬该try块中的异常。


查看完整回答
反对 回复 2019-10-15
  • 3 回答
  • 0 关注
  • 352 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信