「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > この Java 例外処理例で「MyExc2」例外が消えるのはなぜですか?

この Java 例外処理例で「MyExc2」例外が消えるのはなぜですか?

2024 年 11 月 4 日に公開
ブラウズ:279

Why Does the `MyExc2` Exception Disappear in This Java Exception Handling Example?

Catch 句と Final 句での例外処理

Java で例外処理を扱う場合、catch 句と Final 句の間の相互作用を把握することが重要です。 。大学の課題に対して提供された次の例を考えてみましょう:

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();
        }
    }
}

質問はこのコードの出力に対して行われました。 「13Exception in thread main MyExc2」と答えた人もいるかもしれませんが、正解は「132Exception in thread main MyExc1」です。

MyExc2 が消える理由

理解の鍵正しい出力は、catch 句とfinally 句の動作にあります。 catch ブロックまたはfinally ブロック内で例外がスローされると、フローに重大な影響を及ぼします。内訳は次のとおりです:

  • catch ブロックの例外: 新しい例外が catch ブロックでスローされた場合 (上記の throw new MyExc2() で見られるように)、元の例外は次のようになります。 「中止されました。」現在の実行パスは不完全なままであり、新しい例外が外側に伝播する例外として引き継がれます。
  • Exception infinally block: 同様に、新しい例外がスローされた場合も同様です。 Finally ブロックでは、元の例外も中止されます。ただし、注意すべき重要な点があります:

    • Catch ブロックのfinally ブロック: 新しい例外が catch ブロックのfinally ブロックでスローされた場合でも、その catch ブロックの影響を受けます。

例外のトレース

これらの原則に基づいて実行をトレースすると、次のことがわかります。

  1. メインの try ブロックは「1」を出力し、q() を呼び出します。
  2. q() 内で、try ブロックは MyExc1 をスローします。
  3. catch ブロックq() の例外はサイレントに処理されます。
  4. q() のfinally ブロックは「3」を出力し、例外をスローします。
  5. main の Catch ブロック: ]

    • MyExc2 がこのブロックにスローされ、元の MyExc1 が中止されます。
    • ただし、catch ブロックにはまだ実行される Final ブロッ​​クがあります。
  6. メインの最終ブロック:

    • MyExc1 がこのブロックにスローされ、MyExc2 が中止されます。
]

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

を処理していた catch ブロックのfinally ブロックで新しい例外 (MyExc1) がスローされるため、「忘れられた」状態になります。
最新のチュートリアル もっと>

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

Copyright© 2022 湘ICP备2022001581号-3