一尘不染

Java 在catch和finally子句中引发异常

java

在大学里有关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去哪了。


阅读 429

收藏
2020-03-18

共1个答案

一尘不染

通过阅读你的答案并了解你可能的想法,我相信你认为“进行中的例外”具有“优先权”。记住:

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

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

当在catch块中引发新异常时,新异常仍受该catch的finally块(如果有)的影响。

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

2020-03-18