在大学里有关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去哪了。
13Exception in thread main MyExc2
132Exception in thread main MyExc1
通过阅读你的答案并了解你可能的想法,我相信你认为“进行中的例外”具有“优先权”。记住:
当一个新的异常被抛出到一个catch块或将要传播到该块之外的finally块中时,当新的异常向外传播时,当前异常将被中止(并被遗忘)。与其他任何异常一样,新异常开始释放堆栈,退出当前块(catch或finally块),并在此过程中接受任何适用的catch或finally块。
请注意,适用的catch或finally块包括:
当在catch块中引发新异常时,新异常仍受该catch的finally块(如果有)的影响。
现在,请回溯执行过程,并记住,每当你点击时throw,都应中止跟踪当前异常并开始跟踪新异常。