猿问

在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 in thread main MyExc2,但是正确答案是132Exception in thread main MyExc1。怎么会这样 我只是不明白MyExc2去哪了。


慕妹3242003
浏览 353回答 3
3回答

料青山看我应如是

基于阅读您的答案并了解您可能的想法,我相信您认为“进行中的例外”具有“优先权”。记住:当新的异常被抛出在catch块中或将要传播到该块之外的finally块中时,当前的异常将被中止(并被遗忘),因为新的异常向外传播。与其他任何异常一样,新异常开始释放堆栈,退出当前块(catch或finally块),并在此过程中受到任何适用的catch或finally块的约束。请注意,适用的catch或finally块包括:当在catch块中引发新异常时,新异常仍受该catch的finally块(如果有)的影响。现在,请回溯执行过程,并记住,每当您单击时throw,都应中止跟踪当前异常并开始跟踪新异常。

MMMHUHU

即使从try / catch块中的任何位置抛出异常,都将执行finally子句。由于它是在中执行的最后一个,main并且会引发异常,因此调用者会看到该异常。因此,确保该finally子句不抛出任何内容的重要性,因为它会吞噬该try块中的异常。
随时随地看视频慕课网APP

相关分类

Java
我要回答