ホームページ > Java > &#&チュートリアル > Java 例外処理コードが「スレッド メイン MyExc2 の 13Exception」ではなく「スレッド メイン MyExc1 の 132Exception」を生成するのはなぜですか?

Java 例外処理コードが「スレッド メイン MyExc2 の 13Exception」ではなく「スレッド メイン MyExc1 の 132Exception」を生成するのはなぜですか?

Linda Hamilton
リリース: 2024-10-29 18:38:12
オリジナル
1031 人が閲覧しました

Why does the Java exception handling code produce

Java での例外処理: 曖昧さの解明

不可解な Java 例外処理シナリオで、大学の質問で次のコード スニペットが提示されました。

<code class="java">// Exception Heirarchy
class MyExc1 extends Exception {}
class MyExc2 extends Exception {}
class MyExc3 extends MyExc2 {}

// Main Class
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」です。

曖昧さを明確にする

このパズルを解読するには、例外の優先順位を理解することが不可欠です。

  • 原則: 新しい例外が catch ブロックまたは Final ブロッ​​ク内でスローされると、処理されている現在の例外は中止されます。
  • 結果:

    • 現在の例外の伝播が停止されます。
    • 新しい例外が伝播例外になります。
    • 新しい例外は通常どおりスタックを巻き戻します。該当する catch ブロックまたはfinally ブロックに遭遇しました。

実行の再トレース

この原則をコードに適用します:

  1. 初期実行:

    • 行 13: MyExc1 は q() の try ブロックにスローされます。
    • 行 18: MyExc1 は q() の catch ブロックにキャッチされます。
    • 21 行目: 21 行目が実行されます (3 が出力されます)。
  2. Catch ブロック例外:

    • 行 19: MyExc2 は main() の catch ブロックでスローされます。
    • 行 22: MyExc2 は MyExc1 の伝播を中止します。
    • 19 行目: MyExc2 がスタックの巻き戻しを開始します。
  3. Main の Try ブロックで実行が再開されます:

    • 15 行目: 行 15 が実行されます (2 が出力されます)。
    • 行 16: MyExc1 は main() のfinally ブロックにスローされます。
    • 行 16: MyExc1 は MyExc2 の伝播を中止します。
    • 行 16: MyExc1 はスタックの巻き戻しを開始します (それでもメインの Final ブロッ​​クの影響を受けます)。
  4. Finally ブロック例外:

    • 行 23: main() のfinally ブロックで例外がスローされます。
    • 行 23: 例外により MyExc1 の伝播が中止されます。
    • 行 23: 例外の巻き戻しが開始されます。

出力:

例外が伝播するため、最終出力は「132Exception in thread main MyExc1」です。 main メソッドのメイン メソッドは、16 行目でスローされた MyExc1 です。16 行目で MyExc1 がスローされると、19 行目でスローされた MyExc2 は中止されます。

以上がJava 例外処理コードが「スレッド メイン MyExc2 の 13Exception」ではなく「スレッド メイン MyExc1 の 132Exception」を生成するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート