在大学的一个 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
MyExc2
根据阅读您的答案并了解您可能如何想出它,我相信您认为“进行中的异常”具有“优先级”。记住:
当在catch 块或 finally 块 中抛出一个新异常并将传播出该块时,当前异常将在新异常向外传播时中止(并被遗忘)。新异常开始展开堆栈,就像任何其他异常一样,中止当前块(catch 或 finally 块)并在此过程中受到任何适用的 catch 或 finally 块的影响。
请注意, 适用的 catch 或 finally 块 包括:
当在 catch 块中抛出新异常时,新异常仍受制于该 catch 的 finally 块(如果有)。
现在回溯执行,记住,每当您点击 时throw,您应该中止跟踪当前异常并开始跟踪新异常。
throw