MyExc2 例外が catch ブロックでスローされているにもかかわらず、コード スニペットが出力「132Exception in thread main MyExc1」を生成するのはなぜですか?

Barbara Streisand
リリース: 2024-10-29 22:30:29
オリジナル
690 人が閲覧しました

Why does the code snippet produce the output

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 の例外処理メカニズムによると:

  1. そのブロックから伝播される catch または Final ブロッ​​ク内で例外がスローされると、現在の例外は自動的に中止され、忘れられます。
  2. 新しい例外はスタックの巻き戻しを開始し、途中で任意の catch ブロックまたはfinally ブロックに準拠します。
  3. 特に、catch ブロックでスローされた新しい例外は、その catch のfinally ブロックの影響を受けます (存在する場合)。

例外フローのトレース

これを念頭に置いて、コード スニペットの実行をステップごとにトレースしてみましょう。

  • プログラムは main メソッドで開始され、「1」を出力します。
  • q メソッドで例外がスローされ、main の catch ブロックによってキャッチされます。
  • catch ブロック内で、新しい例外が発生し、 MyExc2 がスローされます。これにより、元の例外 MyExc1 が中止されます。
  • MyExc2 例外は、catch ブロックからfinally ブロックに伝播されます。
  • finally ブロックは、「2」を出力します。ただし、q メソッドを終了する前に、finally ブロックが新しい例外をスローし、スタックの巻き戻しが開始されます。
  • 新しい例外は、q メソッドの catch ブロックでキャッチされない例外です。
  • Exception 例外は q メソッドからメイン メソッドのfinally ブロックに伝播します。
  • main のfinally ブロックは「3」を出力し、MyExc1 例外をスローします。
  • MyExc1 例外はメイン メソッドから伝播し、仮想マシンによってキャッチされます。

出力を理解する

このトレースから、次のことがわかります。

  • メイン メソッドから伝播する最後の例外は MyExc1 です。
  • スタック トレースには「132」が含まれており、これはプログラムによって出力された出力に対応します。

したがって、正しい出力は「132Exception in thread main MyExc1」です。

以上がMyExc2 例外が catch ブロックでスローされているにもかかわらず、コード スニペットが出力「132Exception in thread main MyExc1」を生成するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!