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

Susan Sarandon
リリース: 2024-10-30 10:08:02
オリジナル
474 人が閲覧しました

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

Catch 句と Final 句での例外処理

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

<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>
ログイン後にコピー

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

MyExc2 が消える理由

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

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

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

例外のトレース

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

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

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

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

したがって、正しい出力は「132Exception in thread main MyExc1」です。 MyExc2 例外は、MyExc2 を処理していた catch ブロックのfinally ブロックで新しい例外 (MyExc1) がスローされるため、「忘れられました」となります。

以上がこの Java 例外処理例で「MyExc2」例外が消えるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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