ホームページ  >  記事  >  Java  >  Final ブロッ​​クでスローされる例外が、Java で最終的に報告される例外であるのはなぜですか?

Final ブロッ​​クでスローされる例外が、Java で最終的に報告される例外であるのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-31 15:56:02875ブラウズ

Why is the exception thrown in the finally block the one that is ultimately reported in Java?

Java での例外処理: Catch 句と Final 句でスローされた例外の影響を理解する

次のコード スニペットを考えてみましょう:

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(); // throws MyExc1 here
        }
    }

    static void q() throws Exception {
        try {
            throw new MyExc1(); // throws MyExc1 here
        }
        catch (Exception y) {
        }
        finally {
            System.out.print(3);
            throw new Exception(); // throws Exception here
        }
    }
}

このスニペットでは、try-catch 句と Final 句の両方で一連の例外がスローされています。予期される出力は、「スレッド メイン MyExc2 の 13Exception」ではなく、「スレッド メイン MyExc1 の 132Exception」です。

この結果を理解するには、Java の例外処理の基本原則を理解する必要があります。

そのブロックから伝播する catch 句またはfinally句内で新しい例外がスローされると、現在の例外は中止され、代わりに新しい例外が伝播されます。

基本的に、現在の例外は忘れられます。そして、新しい例外がスタックの巻き戻しプロセスを引き継ぎます。

指定されたコードでは、MyExc1 例外が最も内側のfinally句でスローされます。この例外は、最終的にメインのfinally句にまで反映されます。ただし、finally 句では、別の例外 MyExc1 がスローされ、元の MyExc1 の伝播が中止されます。したがって、最も外側のfinally句のMyExc1は、外側に伝播される例外になります。

以上がFinal ブロッ​​クでスローされる例外が、Java で最終的に報告される例外であるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。