まずは問題を見ろ
→ javadrill.tech で出題された問題を見る(Step03)
問題のポイント
- 複数の例外が発生する可能性がある処理では、catchを分けることができる。
- それぞれの
catch
ブロックで、例外の種類に応じた適切な処理ができているか? - 「全部 Exception にまとめてcatch」はまだ早い。このステップでは“分けて”処理しろ。
まず、日本語で考えろ
- 配列の中から、指定されたインデックスの値を取り出す
- 取り出した値を、指定された数で割る
この2つをやろうとすると:
- インデックスが範囲外なら →
ArrayIndexOutOfBoundsException
- 割る数が0なら →
ArithmeticException
つまり、「どちらの例外が起きたか」で、対応が変わる。
コメントを書け
// 配列の指定インデックスの値を取り出して、割り算を行う
// インデックスが範囲外なら catch 1、除数が0なら catch 2
// 正常な場合は、値と計算結果を出力する
コメントに従ってコードを書け
public class ExceptionUtil {
public static void process(int[] array, int index, int divisor) {
try {
// 配列から値を取り出す
int value = array[index];
System.out.println("選ばれた値: " + value);
// 割り算を行う
int result = value / divisor;
System.out.println("計算結果: " + result);
} catch (ArrayIndexOutOfBoundsException e) {
// 配列のインデックスが範囲外だった場合
System.out.println("エラー: インデックスが範囲外です");
} catch (ArithmeticException e) {
// 割る数が0だった場合
System.out.println("エラー: ゼロによる除算です");
}
}
}
実行結果の例
process({10, 20, 30}, 2, 10); → 選ばれた値: 30 / 計算結果: 3
process({10, 20, 30}, 5, 2); → エラー: インデックスが範囲外です
process({10, 20, 30}, 1, 0); → 選ばれた値: 20 / エラー: ゼロによる除算です
コードの解説
try
ブロックの中で複数の処理をまとめて書き、複数のcatch
を使ってそれぞれの例外に分岐させている- 最初に配列アクセス、次に除算、という順番の中で何が起きるかを観察することがポイント
catch
を分けることで、「何が起きたか」に応じた適切な処理とメッセージを出せるようになる
つまづきやすいポイント
- 最初に
ArrayIndexOutOfBoundsException
が起きたら、割り算の処理には進まない(処理はそこで止まる) catch (Exception e)
で全部まとめたくなるが、それは次のステップ- 例外の発生順・処理の流れを逐一追いかける癖をつけろ
// tesh:
// 「catch を分ける意味ってあるの?」
// ──あるに決まってんだろ。
//
// 何が起きたかを把握して、
// 何が起きても止まらず、
// しかも意味のある対応ができる。
//
// それが例外処理の本質や。
// 全部まとめてcatchしてたら、成長は止まる。
//
// Just keep typing, baby.
// 分けて、捉えて、制御しろ。それが流れを保つ唯一の方法や。