”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 为什么在这个 Java 异常处理示例中“MyExc2”异常消失了?

为什么在这个 Java 异常处理示例中“MyExc2”异常消失了?

发布于2024-11-04
浏览:479

Why Does the `MyExc2` Exception Disappear in This Java Exception Handling Example?

Catch 和 Final 子句中的异常处理

在 Java 中处理异常处理时,掌握 catch 和 finally 子句之间的相互作用至关重要。考虑以下为大学作业提供的示例:

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 消失

理解的关键正确的输出在于catch 和finally 子句的行为。当 catch 或 finally 块中引发异常时,它会对流程产生重大影响。下面是细分:

  • catch 块中的异常: 如果在 catch 块中抛出新的异常(如上面的 throw new MyExc2() 所示),则原始异常为“中止了。”当前的执行路径不完整,新的异常将作为向外传播的异常接管。
  • finally 块中的异常: 类似地,如果在一个finally块,原来的异常也被中止。不过,有一个关键点需要注意:

    • Catch 块的finally 块: 如果新的异常在catch 块的finally 块中抛出,它仍然会受到该catch 块的约束。最后块,如果有的话。

跟踪异常

根据这些原则跟踪执行,我们可以看到:

  1. main 中的 try 块打印“1”并调用 q()。
  2. 在 q() 内部,try 块抛出一个 MyExc1.
  3. catch 块in q() 默默地处理异常。
  4. q() 中的finally 块打印“3”并抛出异常。
  5. main 中的Catch 块:

    • MyExc2 被抛出到这个块中,中止原来的 MyExc1。
    • 但是,catch 块有一个仍然执行的 finally 块。
  6. 最后在 main 中的块:

    • MyExc1 被抛出到这个块中,中止 MyExc2。

因此,正确的输出是“132Exception in thread main MyExc1”。 MyExc2 异常被“遗忘”,因为在处理 MyExc2 的 catch 块的 finally 块中引发了新异常 (MyExc1)。

最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3