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 メソッドでキャッチされ、スタックトレースが表示されます。
実習で理解を深めよう / Practice to deepen your understanding
この内容についてJavaDrillで実際に手を動かして学習できます
Practice with JavaDrill to learn hands-on


