まずは問題を見ろ
→ javadrill.tech で出題された問題を見る(Step04)
問題のポイント
ArrayIndexOutOfBoundsException
もArithmeticException
も、すべてはException
の子どもたち。- 例外の親クラスで catch すれば、どんな例外もまとめて捕まえられる。
- 分けるのが正義とは限らん。まとめるときの文脈とメリットを掴め。
まず、日本語で考えろ
また配列アクセス → 割り算。
でも今回は、「何が起きたかは詳しく気にせず、とにかく止めずに処理したい」ケースや。
ならば、例外の型ごとに分けるより、“全部ひとくくり”にしたほうが効率的なこともある。
コメントを書け
// 配列のインデックスと除算処理を行う
// 例外が起きたら Exception ですべてまとめてcatchする
// getMessage() で例外の原因を出力する
コメントに従ってコードを書け
public class ExceptionUtil {
public static void safeProcess(int[] array, int index, int divisor) {
try {
int value = array[index];
System.out.println("選ばれた値: " + value);
int result = value / divisor;
System.out.println("計算結果: " + result);
} catch (Exception e) {
System.out.println("例外が発生しました: " + e.getMessage());
}
}
}
実行結果の例
safeProcess({10, 20, 30}, 1, 5); → 選ばれた値: 20 / 計算結果: 4
safeProcess({10, 20, 30}, 3, 2); → 例外が発生しました: Index 3 out of bounds for length 3
safeProcess({10, 20, 30}, 0, 0); → 選ばれた値: 10 / 例外が発生しました: / by zero
コードの解説
catch (Exception e)
にすることで、種類を問わずすべての例外を一括で処理できるe.getMessage()
を使えば、例外の発生原因を一行で確認できる- このスタイルは「とにかく止まるな」「ログだけ残せ」って場面で有効
- ただし、何の例外かが判別しづらくなるというデメリットもある
つまづきやすいポイント
Exception
でcatchしてると、具体的な対応(復旧・分岐)はできないgetMessage()
は簡潔だが、全体のスタックトレースは表示されない- 複数の例外のどれが起きたかに応じた処理が必要な場合は、やっぱり個別にcatchすべき(Step03参照)
// tesh:
// まとめて catch する。それは甘えじゃない。
// 状況に応じて“分けるか、まとめるか”を選ぶ判断力。それが問われてる。
//
// すべてを一括で握りつぶす、という戦略もある。
// でもそれは、「何もわからないから」じゃなく「構造を知って選んだ」から許されるやり方や。
//
// Just keep typing, baby.
// catch は構文。選び方は、戦略や。