java - 在 catch 和 finally 子句中抛出异常

标签 java exception

在大学的一个 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 去哪里了。

最佳答案

根据阅读您的答案并了解您可能如何想出它,我相信您认为“进行中的异常”具有“优先级”。请记住:

当一个新的异常被抛出一个 catch block 或 finally block 并且将传播出该 block 时,当前的异常将被中止(并被遗忘),因为新的异常是向外传播。新异常开始展开堆栈,就像任何其他异常一样,中止当前 block (catch 或 finally block )并在此过程中受到任何适用的 catch 或 finally block 的影响。

请注意,适用的 catch 或 finally block 包括:

当在 catch block 中抛出新异常时,新异常仍受制于该 catch 的 finally block (如果有)。

现在回溯执行,记住,每当您点击 throw 时,您应该中止跟踪当前异常并开始跟踪新异常。

关于java - 在 catch 和 finally 子句中抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3779285/

相关文章:

C# - 阅读器关闭时调用 Read 的尝试无效

Android JSONArray 异常

java - Maven 配置文件在运行 jdk 时激活,而不是在工具链 jdk 上激活

java - 我正在尝试打开对话框,但我不断收到编译错误 `Builder (android.content.Context) in Builder cannot be applied to the Activity

javascript - 为什么这个 JavaScript Promise reject() 在结果回调中得到处理?

c++ - Std::stoul 在 C++ 中失败后未被捕获

java - Try-Catch block 终止

java - Java 运行时环境的 fatal error

java - 在 Selenium + Java 中获取当前选定的选项作为下拉菜单的文本/字符串

java - 无法连接到 Pentaho Kettle 中的 PostgreSQL 数据库