小编典典

在 catch 和 finally 子句中抛出异常

all

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


阅读 82

收藏
2022-08-07

共1个答案

小编典典

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

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

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

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

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

2022-08-07