Catch 和 Final 块中的异常传播
在 Java 程序中,当发生异常时,它会通过堆栈传播,直到被处理为止通过合适的 catch 块或终止程序。但是,异常也可以在 catch 或 finally 块中引发,从而引发有关其传播行为的问题。
考虑以下代码片段:
<code class="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(); // Exception thrown in catch block } finally { System.out.print(2); throw new MyExc1(); // Exception thrown in finally block } } static void q() throws Exception { try { throw new MyExc1(); } catch (Exception y) { } finally { System.out.print(3); throw new Exception(); // Exception thrown in finally block } } }</code>
当在 catch 或 finally 块中引发异常时finally 块中,适用以下原则:
异常覆盖: 如果在 catch 或 finally 块中抛出一个新的异常,并且打算传播到该块之外,则当前异常正在处理中将被中止,新的异常将向外传播,取代它的位置。中止的异常将被丢弃。
在提供的代码中,catch 和 finally 块中的异常场景演示了这个原理:
因此,当程序执行到展开堆栈后的main方法时,MyExc2异常已已被 MyExc1 覆盖,随后被打印和处理。因此,正确的输出是“132Exception in thread main MyExc1.”
以上是当 Java 中的 catch 和 finally 块中抛出异常时,异常传播如何工作?的详细内容。更多信息请关注PHP中文网其他相关文章!