例外修羅道 Step02:配列外アクセスを制御せよ

0004_例外修羅道-step02 learn

まずは問題を見ろ

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.
// 例外は想定できる。想定したら、制御できる。

例外修羅道:全体のステップ構成はこちら