catch 句と finally 句で例外がスローされる 質問する

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

ベストアンサー1

あなたの回答を読んで、あなたがどのようにしてそれを思いついたのかを考えると、あなたは「進行中の例外」が「優先」であると考えていると思います。次の点に留意してください。

新しい例外がスローされると、catchブロックまたはfinallyブロックそのブロックから伝播する例外が発生した場合、新しい例外が外側に伝播するにつれて、現在の例外は中止され (忘れ去られ) ます。新しい例外は、他の例外と同様にスタックの巻き戻しを開始し、現在のブロック (catch または finally ブロック) から中止され、途中で適用可能な catch または finally ブロックの対象となります。

ご了承ください適用可能なcatchまたはfinallyブロック含まれるもの:

catch ブロックで新しい例外がスローされた場合、その新しい例外は、その catch の finally ブロック (存在する場合) の対象となります。

throwここで、 を押すたびに現在の例外のトレースを中止し、新しい例外のトレースを開始することを覚えておいて、実行を再トレースします。

おすすめ記事