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 ブロックの両方の例外シナリオが次の原則を示しています。
その結果、プログラムの実行がスタックを巻き戻した後に main メソッドに到達すると、MyExc2 例外はMyExc1 によってオーバーライドされ、その後印刷および処理されます。したがって、正しい出力は「132Exception in thread main MyExc1.」です。
以上がJava の catch ブロックとfinally ブロック内で例外がスローされた場合、例外の伝播はどのように機能しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。