「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Java 例外処理コードが「スレッド メイン MyExc2 の 13Exception」ではなく「スレッド メイン MyExc1 の 132Exception」を生成するのはなぜですか?

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

2024 年 11 月 6 日に公開
ブラウズ:260

Why does the Java exception handling code produce \

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

不可解な 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();
        }
    }
}

質問はその出力を求めており、提供された答えは「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 はスタックの巻き戻しを開始します (それでも main のfinally ブロックの影響を受けます)。
  4. Finally Block Exception:

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

出力:

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

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3