ホームページ  >  記事  >  Java  >  Java の catch ブロックとfinally ブロック内で例外がスローされた場合、例外の伝播はどのように機能しますか?

Java の catch ブロックとfinally ブロック内で例外がスローされた場合、例外の伝播はどのように機能しますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-02 20:09:03825ブラウズ

How does exception propagation work when exceptions are thrown within catch and finally blocks in Java?

Catch and Final Blocks での例外の伝播

Java プログラムでは、例外が発生すると、例外が処理されるまでスタックを介して伝播します。適切な catch ブロックを使用するか、プログラムを終了します。ただし、例外は catch ブロックまたは Finally ブロック内でスローされることもあり、その伝播動作について疑問が生じます。

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

<code class="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(); // Exception thrown in catch block
        }
        finally {
            System.out.print(2);
            throw new MyExc1(); // Exception thrown in finally block
        }
    }

    static void q() throws Exception {
        try {
            throw new MyExc1();
        }
        catch (Exception y) {
        }
        finally {
            System.out.print(3);
            throw new Exception(); // Exception thrown in finally block
        }
    }
}</code>

例外が catch ブロック内でスローされた場合、またはfinally ブロックでは、次の原則が適用されます:

例外のオーバーライド: 新しい例外が catch またはfinally ブロック内でスローされ、そのブロックから伝播することが意図されている場合、進行中の現在の例外は中止され、新しい例外が外側に伝播して、その代わりになります。中止された例外は破棄されます。

提供されたコードでは、catch ブロックとfinally ブロックの両方の例外シナリオが次の原則を示しています。

  • Catch Block:例外 i が catch ブロック内でスローされると、すぐに新しい例外 MyExc2 に置き換えられ、処理中の例外になります。
  • Finally Block: 同様に、例外がスローされると、 Finally ブロック内で、現在の MyExc2 例外を MyExc1 に置き換え、それを進行中の新しい例外にします。

その結果、プログラムの実行がスタックを巻き戻した後に main メソッドに到達すると、MyExc2 例外はMyExc1 によってオーバーライドされ、その後印刷および処理されます。したがって、正しい出力は「132Exception in thread main MyExc1.」です。

以上がJava の catch ブロックとfinally ブロック内で例外がスローされた場合、例外の伝播はどのように機能しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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