Catch およびFinally ブロックでの例外処理
最近の大学の Java 課題で、学生は次のコード スニペットに遭遇し、予測するように求められました。出力:
<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>
生徒が「スレッド メイン MyExc2 の 13Exception」と答えたとき、正解が「スレッド メイン MyExc1 の 132Exception」であることを知って驚きました。
Catch ブロックと Final ブロックでの例外の伝播を理解する
正しい出力を理解するには、catch ブロックと Finally ブロック内の例外の動作を理解することが重要です。 Java の例外処理メカニズムによると:
例外フローのトレース
これを念頭に置いて、コード スニペットの実行をステップごとにトレースしてみましょう。
出力を理解する
このトレースから、次のことがわかります。
したがって、正しい出力は「132Exception in thread main MyExc1」です。
以上がMyExc2 例外が catch ブロックでスローされているにもかかわらず、コード スニペットが出力「132Exception in thread main MyExc1」を生成するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。