Catch 句と Final 句での例外処理
Java で例外処理を扱う場合、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(); } 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(); } } }</code>
このコードの出力についての質問です。 「13Exception in thread main MyExc2」と答えた人もいるかもしれませんが、正解は「132Exception in thread main MyExc1」です。
MyExc2 が消える理由
理解の鍵正しい出力は、catch 句とfinally 句の動作にあります。 catch ブロックまたはfinally ブロック内で例外がスローされると、フローに重大な影響を及ぼします。内訳は次のとおりです:
Finally ブロックの例外: 同様に、新しい例外がスローされた場合も同様です。 Finally ブロックでは、元の例外も中止されます。ただし、注意すべき重要な点があります:
例外のトレース
これらの原則に基づいて実行をトレースすると、次のことがわかります。
メインのキャッチ ブロック:
メインの最終ブロック:
したがって、正しい出力は「132Exception in thread main MyExc1」です。 MyExc2 例外は、MyExc2 を処理していた catch ブロックのfinally ブロックで新しい例外 (MyExc1) がスローされるため、「忘れられました」となります。
以上がこの Java 例外処理例で「MyExc2」例外が消えるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。