はじめに:「配列の範囲外」はJavaで頻出する実行時エラー
Javaを使って配列やListを操作していると、実行時に突然こんなエラーにぶつかることがあります:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5
これはJava初心者が「配列」を使い始めたときに、かなりの確率で遭遇する代表的なエラーです。
最初は「なぜこのエラーが出るのか」がよくわからないかもしれません。ですが、配列の「インデックス(要素番号)」と「length(長さ)」の違いを理解すれば、納得できて回避できるようになります。
この記事では、「ArrayIndexOutOfBoundsException」の意味、よくある原因と対処法を、初心者向けにわかりやすく解説します。
エラー文の意味を理解しよう
java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5
このエラーは次のように解釈できます:
- Index 5 → 配列の5番目の要素(0から数えて6番目)を参照しようとした
- out of bounds for length 5 → でもその配列の長さ(要素数)は5個だから、インデックス5は存在しない
Javaでは、配列の要素は「0」から始まるため、長さが5の配列には0〜4
までのインデックスしか存在しません。
初心者のうちは「長さが5なら5番目まである」と思ってしまいがちですが、これは**「1始まり」の感覚**が抜けきっていないためです。
よくある原因と対処法
原因1:配列の最大要素番号を誤解
間違った例:
int[] numbers = new int[5];
numbers[5] = 100;
このコードでは、numbers[5]
を代入しようとしていますが、配列の長さは5であるため、最大の有効インデックスは4
までです。
修正方法:
// 有効なインデックスは 0〜4
numbers[4] = 100;
原因2:ループ条件に「<=」を使っている
間違った例:
String[] fruits = {"apple", "banana", "orange"};
for (int i = 0; i <= fruits.length; i++) {
System.out.println(fruits[i]);
}
i <= fruits.length
の条件でループすると、i
が3
のときにfruits[3]
を参照し、エラーになります。
修正方法:
for (int i = 0; i < fruits.length; i++) {
System.out.println(fruits[i]);
}
ポイントは「<
(未満)」を使うことです。
原因3:リストで要素が追加されていないのに参照
リスト(List)でも、インデックスが存在しない位置を参照すると同様のエラーが発生します。
List<String> list = new ArrayList<>();
System.out.println(list.get(0)); // 要素が入っていない
修正方法:
list.add("hello");
System.out.println(list.get(0));
リスト操作では .add()
を使ってから .get()
するのが基本です。
エラーを防ぐポイント
- 配列のインデックスは「0開始」であることを常に意識する
- ループ条件には
i < 配列.length
を使う(<=
ではない) .get()
を使う前には.size()
や.isEmpty()
で確認するfor-each
文を使えば範囲外アクセスの心配なし(例:for (String fruit : fruits)
)
復習クイズ
次のコードはエラーになるでしょうか?原因も考えてみましょう。
int[] nums = new int[3];
for (int i = 0; i <= nums.length; i++) {
nums[i] = i * 10;
}
→ 正解:エラーになる
なぜなら i <= nums.length
によって i == 3
のとき nums[3]
を参照し、インデックス範囲外となるためです。
Javaの配列は0から始まり、nums.length
が3の場合、有効なインデックスは0, 1, 2
の3つです。i == 3
のときは存在しないnums[3]
を参照しようとしてエラーが発生します。
正しいコードの例:
int[] nums = new int[3];
for (int i = 0; i < nums.length; i++) {
nums[i] = i * 10;
System.out.println("nums[" + i + "] = " + nums[i]);
}
このように i < nums.length
を条件にすることで、配列の範囲内だけを参照することができます。出力結果は以下のようになります:
nums[0] = 0
nums[1] = 10
nums[2] = 20
このように「lengthとの比較では常に <
を使う」という習慣を身につけておくことで、配列に関する実行時エラーを防ぐことができます。
まとめ:配列操作では「0開始」「範囲チェック」が命!
- Javaの配列は 0から始まる ことを忘れない
.length
は「要素数」、最後のインデックスはlength - 1
for
ループではi < 配列.length
を徹底する- Listでも
.get(index)
の前に.size()
を確認する
配列やループ操作は、Javaの基礎でありながら多くのエラーを生む落とし穴でもあります。
ですが、考え方をしっかり理解していれば、正しく安全に使うことができます。
コメント