【初心者向けエラーシリーズ#5】「ArrayIndexOutOfBoundsException」とは?Javaの配列でよくある「範囲外」エラーを徹底解説!

この記事は約5分で読めます。
記事内に広告が含まれています。

はじめに:「配列の範囲外」は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 の条件でループすると、i3のときに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の基礎でありながら多くのエラーを生む落とし穴でもあります。
ですが、考え方をしっかり理解していれば、正しく安全に使うことができます。

コメント

タイトルとURLをコピーしました