019 例外と例外処理(例外の伝播と再スロー) 016 解答例

public class ExceptionPropagationExample {
    public static void main(String[] args) {
        try {
            // メインメソッドから例外がスローされる可能性があるので、try-catch文で捕捉する
            methodA();
        } catch (Exception e) {
            System.out.println("メインメソッド: " + e.getMessage());
        }
    }

    static void methodA() throws Exception {
        // methodA は例外をスローする可能性があるので、throws節を使用して呼び出し元に通知
        methodB();
    }

    static void methodB() throws Exception {
        // methodB は例外をスローする可能性があるので、throws節を使用して呼び出し元に通知
        methodC();
    }

    static void methodC() throws Exception {
        // 例外をスローするコードを追加
        // ここではArithmeticExceptionをスローし、その際にエラーメッセージを設定
        throw new ArithmeticException("methodC で例外が発生しました");
    }
}

このプログラムを実行すると、methodC で発生した ArithmeticExceptionmethodB、さらには methodA まで伝播し、最終的には main メソッドでキャッチされてエラーメッセージが表示されるでしょう。これにより、例外がどのように伝播するかを確認できます。

例外の伝播

「例外の伝播」とは、プログラム内で例外が発生し、その例外がメソッドからメソッドへと伝播していくプロセスのことを指します。このプロセスでは、例外がスローされたメソッドが、その例外を処理するのではなく、呼び出し元に例外を通知し、上位の呼び出し階層で例外が処理されることが期待されます。

以下に、例外の伝播に関する主なポイントを解説します。

throws節の使用:

メソッド内で発生した例外をそのメソッドの呼び出し元に通知するために、throws 節が使用されます。throws 節では、メソッドがスローする可能性のある例外を宣言します。

static void methodA() throws Exception {
    // ...
}

try-catch文での例外処理:

例外が発生する可能性のあるメソッドを呼び出す場合、その呼び出し元で try-catch 文を使用して例外をキャッチし、適切な処理を行います。

try {
    methodA();
} catch (Exception e) {
    // 例外が発生した場合の処理
}

伝播の方向:

例外は通常、下位のメソッドから上位のメソッドへと伝播します。例外が発生したメソッドが、その例外を処理できない場合、呼び出し元に例外が伝播します。このプロセスが続き、最終的にはプログラム全体をカバーするようなトップレベルのエラーハンドリングが行われます。


throws節の連鎖:

メソッドAがメソッドBを呼び出し、メソッドBで例外が発生する場合、メソッドAでその例外を処理する必要があります。このとき、メソッドAも同様に throws 節を使用して呼び出し元に例外を通知します。

static void methodA() throws Exception {
    methodB();
}

static void methodB() throws Exception {
    // 例外が発生する可能性がある処理
}

例外の伝播は、プログラムの構造をより柔軟にし、例外を的確に処理できるようにするために重要な概念です。しかし、過度な伝播はコードを複雑にする可能性があるため、慎重に管理する必要があります。

「019 例外と例外処理」問題集リスト