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

在大学的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在线程主MyExc2,但正确答案是132Exception在线程主MyExc1。为什么呢?我只是不明白MyExc2去哪里。

最佳答案
基于阅读你的答案,看看你是如何想出来的,我相信你认为一个“例外在进行”有“优先”。记住:

当一个新的异常抛出一个catch块或finally块将传播出该块,那么当新的异常向外传播时,当前异常将被中止(和被遗忘)。新的异常开始展开堆栈就像任何其他异常,中止当前块(catch或finally块),并受到任何适用的catch或finally块的方式。

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

当在catch块中抛出新的异常时,新的异常仍然受到catch的finally块(如果有)的影响。

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

转载注明原文:java – 在catch和finally子句中抛出异常 - 代码日志