在大学里一个关于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
,都应中止跟踪当前异常并开始跟踪新异常。

MMMHUHU
TA贡献1834条经验 获得超8个赞
即使从try / catch块中的任何位置抛出异常,都将执行finally子句。
由于它是在中执行的最后一个,main
并且会引发异常,因此调用者会看到该异常。
因此,确保该finally
子句不抛出任何内容的重要性,因为它会吞噬该try
块中的异常。
添加回答
举报
0/150
提交
取消