首页  >  文章  >  Java  >  当 Java 中的 catch 和 finally 块中抛出异常时,异常传播如何工作?

当 Java 中的 catch 和 finally 块中抛出异常时,异常传播如何工作?

Patricia Arquette
Patricia Arquette原创
2024-11-02 20:09:03831浏览

How does exception propagation work when exceptions are thrown within catch and finally blocks in Java?

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 块中的异常场景演示了这个原理:

  • Catch 块:当 catch 块内抛出异常 i 时,它立即被新异常 MyExc2 替换,成为正在进行的异常。
  • Finally Block: 同样,当抛出异常时在finally块中,它用MyExc1替换了当前的MyExc2异常,使其成为正在进行中的新异常。

因此,当程序执行到展开堆栈后的main方法时,MyExc2异常已已被 MyExc1 覆盖,随后被打印和处理。因此,正确的输出是“132Exception in thread main MyExc1.”

以上是当 Java 中的 catch 和 finally 块中抛出异常时,异常传播如何工作?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn