class CustomExceptionA extends Exception {
public CustomExceptionA(String message) {
super(message);
}
}
class CustomExceptionB extends Exception {
public CustomExceptionB(String message) {
super(message);
}
}
public class ExceptionChainingExample {
public static void main(String[] args) {
try {
// メソッドCを呼び出して例外のチェーンを発生させる
methodC();
} catch (CustomExceptionA finalException) {
// 最終的にキャッチされる例外を表示
System.out.println("最終的な例外がキャッチされました。");
finalException.printStackTrace();
}
}
// メソッドA
static void methodA() throws CustomExceptionA {
throw new CustomExceptionA("CustomExceptionA が発生しました。");
}
// メソッドB
static void methodB() throws CustomExceptionB {
throw new CustomExceptionB("CustomExceptionB が発生しました。");
}
// メソッドC
static void methodC() throws CustomExceptionA {
try {
// メソッドAを呼び出す
methodA();
} catch (CustomExceptionA exceptionA) {
try {
// メソッドBを呼び出し、initCauseメソッドで例外のチェーンを構築
methodB();
exceptionA.initCause(new CustomExceptionB("CustomExceptionB が CustomExceptionA にチェーンされました。"));
} catch (CustomExceptionB exceptionB) {
// 例外Bが発生した場合は、例外Aをスロー
throw exceptionA;
}
}
}
}
このプログラムでは、methodC
内でまず methodA
を呼び出し、その例外が捕捉されたら methodB
を呼び出し、initCause
メソッドを使用して例外のチェーンを構築しています。最終的に、CustomExceptionB
が CustomExceptionA
にチェーンされた例外が main
メソッドでキャッチされ、スタックトレースが表示されます。