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 サイトの他の関連記事を参照してください。