1. ホーム
  2. java

[解決済み] catch節とfinally節で投げられる例外

2022-04-21 17:04:47

質問

大学の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ブロックまたはfinallyブロック 新しい例外が外部に伝搬されると、現在の例外は中断され、忘れ去られます。 新しい例外は、他の例外と同じようにスタックを巻き戻し、現在のブロック(catchまたはfinallyブロック)から中止され、途中で適用可能なcatchまたはfinallyブロックに従います。

なお 適用可能なcatchまたはfinallyブロック が含まれます。

新しい例外がcatchブロック内で投げられた場合、その新しい例外は、もしあれば、そのcatchのfinallyブロックに従います。

次に、実行を再確認してください。 throw 現在の例外のトレースを中断し、新しい例外のトレースを開始する必要があります。