まずは問題を見ろ
→ javadrill.tech で出題された問題を見る(Step02)
問題のポイント
- 配列のインデックスを間違えると
ArrayIndexOutOfBoundsException
が発生する - Javaでは「存在しない要素に触ろうとしたら即落ちる」
- その例外を
try-catch
で捕まえて、ユーザーに意味のあるメッセージを出せるか? - 配列アクセスは「危険な操作」や。まずはそれを受け止めろ。
まず、日本語で考えろ
配列 int[] nums = {10, 20, 30}
がある。nums[1]
はOK。でも nums[3]
は……?アウトやな。配列の長さは3、インデックスは0〜2まで。
じゃあ nums[3]
を触ろうとしたらどうなる?落ちる。
じゃあその「落ち」を、ちゃんと拾って処理できるか?
コメントを書け
// 配列の指定されたインデックスの値を出力する
// インデックスが範囲外なら例外をcatchしてエラーメッセージを出す
コメントに従ってコードを書け
public class ExceptionUtil {
public static void printElement(int[] array, int index) {
try {
// 指定されたインデックスの値を出力
int value = array[index];
System.out.println("選ばれた値: " + value);
} catch (ArrayIndexOutOfBoundsException e) {
// インデックスが範囲外だった場合の処理
System.out.println("エラー: インデックスが範囲外です");
}
}
}
実行結果の例
printElement({10, 20, 30}, 1); → 選ばれた値: 20
printElement({10, 20, 30}, 3); → エラー: インデックスが範囲外です
printElement({10, 20, 30}, 0); → 選ばれた値: 10
コードの解説
int value = array[index];
で例外が起きる可能性がある。catch (ArrayIndexOutOfBoundsException e)
でそれを受け止める。- 例外が起きたかどうかにかかわらず、ユーザーが混乱しない出力を心がけろ。
- 「例外=バグ」じゃない。起きる前提で設計することがプロの仕事や。
つまづきやすいポイント
- インデックスは0から始まる。
配列の長さ - 1
が最大値。 - 例外が発生したら
catch
に処理が飛ぶことをちゃんと確認しよう ArrayIndexOutOfBoundsException
だけでなく、他の例外も出る可能性がある場合は複数のcatch
を使う(次ステップで扱う)
// tesh:
// 「配列の範囲なんてわかってる」?
// ちゃうねん。落ちたとき、どう振る舞うかが今回の主題や。
//
// バグが起きないコードなんてない。
// だからオレたちは、「落ちても止まらない」設計を覚える必要がある。
//
// 構造を知って、落ちることを想定して、立て直せ。
//
// Just keep typing, baby.
// 例外は想定できる。想定したら、制御できる。