「プログラムが動いた!」と思った次の瞬間、画面に現れたのは謎の呪文
—— java.lang.ArrayIndexOutOfBoundsException
…え?アウト・オブ・バウンズって何!?
配列がそんなに自由奔放だったなんて聞いてないんだけど!?
Java初心者が必ずといっていいほど遭遇するこのエラー、簡単に言えば 「配列の範囲を超えたアクセスをしてしまったよ!」 というJavaからのSOSです。
私も最初はまったく意味がわからず、「いや、配列って何番まであるんだっけ?」と頭の中で混乱したことをよく覚えています。
そこで今回の記事では、「なぜこのエラーが出るのか?」 そして 「どうすれば回避できるのか?」 を、わかりやすい例と共に解説していきます。
これを読めば、もう配列の反乱に怯えずにすむはず…!
はじめに:「配列のエラー、何が悪かったの?」と戸惑った経験
「プログラム、動いた…と思ったらエラー!?」
Javaの勉強を始めて数日。
ようやくfor文や配列の書き方にも慣れてきた頃、私は「ちょっと配列を使ってリストを表示してみよう!」と意気揚々とコードを書いていました。
コードはスッと書けました。
「今度こそ動いてくれるはず…!」そう思って実行ボタンを押した瞬間、画面に現れたのはこの文字列でした。
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
……え、何これ?
「アウト・オブ・なんとかエクセプション?」 「配列の3番目にアクセスしちゃダメってこと? でも3つあるよね??」
当時の私は、エラーメッセージの意味も配列のインデックスルールもよくわからず、「なんでエラーになるのか全然わからない!」と画面を眺めるだけで精一杯でした。
「ArrayIndexOutOfBoundsException」って何者?
この長〜い名前のエラー、正式には java.lang.ArrayIndexOutOfBoundsException といいます。
日本語に訳すなら、
Java:「ねえ、それ、配列の範囲超えてるよ!?アウトなんだけど…!」
というイメージです。
つまりこのエラーは、「存在しない配列の場所を指定しちゃったよ〜!」とJavaが教えてくれる“範囲外アクセス警報”なのです。
初心者あるあるの“配列の罠”
なぜこのエラーにハマってしまったのかというと、Javaの配列は 0から始まる というルールがあるからなんですね。
int[] numbers = {10, 20, 30}; // 長さは3
System.out.println(numbers[3]); // ← エラー!(範囲外アクセス)
このときアクセスできるのは 0〜2 番目までなので、[3] にアクセスしようとするとJavaくんが「その場所はないよ」と怒ってくれる、というわけです。
ここから始まる「配列との良い関係」
このエラーをきっかけに、私は配列のルールやループの書き方、配列の長さの扱い方について徐々に理解を深めていくことができました。
この「ArrayIndexOutOfBoundsException」は、配列という箱の中身を正しく扱うための合図であり、ある意味“初心者の門番”的な存在なのかもしれません。
この章のまとめ
- ArrayIndexOutOfBoundsException は、配列の範囲外にアクセスしたときのエラー
- Javaの配列は 0始まり なので、最大インデックスは length – 1!
- 誰もが一度は通る道だから、怖がらなくてOK!
このあとの章では、実際のエラー例をコード付きで紹介したり、「どうすれば防げるのか?」という視点で解決法も解説していきます。
一緒に「配列に強いJava使い」になっていきましょう!
ArrayIndexOutOfBoundsExceptionとは?― 配列の“範囲”を超えてしまったときの警告
まずこの名前、長すぎませんか?
java.lang.ArrayIndexOutOfBoundsException Javaのエラーメッセージのなかでも、初見で「何これ……」となる長さNo.1(かもしれない)このエラー。
でも実は、名前の意味がわかると原因も自然と見えてくるんです。
分解してみましょう
- Array → 配列
- Index → 番号、添え字(0から始まる)
- OutOfBounds → 範囲外
- Exception → 例外、エラー
つまり直訳すると「配列のインデックスが範囲外でしたよ、というエラー」なんです。
なぜこのエラーが起こるの?
Javaの配列は、インデックスが0から始まるという特徴があります。
int[] nums = {10, 20, 30};
System.out.println(nums[2]); // → OK:30
System.out.println(nums[3]); // → ❌ 範囲外アクセス(エラー!)
この例では、配列 nums の要素数は3。
アクセス可能なのは nums[0] ~ nums[2] までで、nums[3]は「存在しない場所」になるのです。
Javaとしては「その場所、配列の外だよ!」と知らせてくれているのがこのエラーなんですね。
Javaが“厳しい”理由
Javaは、プログラムが安全に動くようにするため、不正なアクセスは即エラーとして止める仕組みを採用しています。
C言語などは、存在しない配列の場所にもアクセスできてしまったりしますが、 Javaでは「知らない場所には触らせませんよ!」と、しっかりガードしてくれるのが特徴なんです。
この厳しさがあるおかげで、バグの早期発見や予期せぬ挙動の防止につながります。
よくある誤解:「配列のlength」と「インデックス最大値」
用語 | 説明 | 例 |
---|---|---|
array.length | 配列の要素数 | 3(※0〜2番まである) |
インデックス最大値 | アクセスできる最後の番号 | array.length – 1 |
つまり、lengthの値=アクセスできるインデックスの“外側”なんです。
これを知っているだけで、「インデックスエラー地獄」をだいぶ回避できます!
まとめ:名前に惑わされず、本質をおさえよう
- ArrayIndexOutOfBoundsException=「配列の範囲外にアクセスしたエラー」
- Javaは「存在しない場所へのアクセス」を防ぐためにこの例外を出してくれる
- array.length – 1までが安全なインデックス!
次章では、このエラーがよく発生する“うっかりミス”のパターンと再現コードを紹介します。
「なんで配列の範囲を間違えちゃうのか?」を一緒にひも解いていきましょう!
よくある発生パターン ― その配列、ホントにそこまでありますか?
配列のエラーは“思い込み”から始まる
ArrayIndexOutOfBoundsExceptionは、配列やリストを操作しているときに「あると思ってた場所が、なかった…」という“うっかりアクセス”で発生します。
ここでは、Java初学者が実際によくやってしまうパターンを、再現コードつきで解説していきます。
パターン①:配列の最後のインデックスを超えてしまう
public class Sample {
public static void main(String[] args) {
int[] nums = {1, 2, 3};
System.out.println(nums[3]); // ← エラー:インデックス3は存在しない
}
}
配列 nums の長さは3。使えるインデックスは 0〜2 まで。
なのに nums[3] と書いてしまい、範囲外アクセス!
対策
- nums.length を使って、安全な範囲内でアクセスする習慣を。
- 最大インデックスは length – 1 であることを忘れずに!
パターン②:for文の条件ミスで範囲外アクセス
int[] data = {10, 20, 30};
for (int i = 0; i <= data.length; i++) { // ❌ 条件に = を入れてしまっている
System.out.println(data[i]);
}
i <= data.length と書くと、最終的に data[3] を読みに行く → エラー!
対策
for (int i = 0; i < data.length; i++) { // ⭕️ < に直す!
System.out.println(data[i]);
}
パターン③:配列の初期化だけして中身がない
String[] names = new String[3]; // サイズはあるけど値は入ってない
System.out.println(names[3]); // ← エラー:インデックス3は存在しない
new String[3] で作っただけだと、入ってるのは全部 null。しかもインデックスは 0〜2 まで!
対策
- 初期化した配列の長さをきちんと確認する
- 値を入れてから使うようにする(配列要素は中身が保証されてない)
パターン④:ArrayListなどのリストに要素を入れてない
List<String> animals = new ArrayList<>();
System.out.println(animals.get(0)); // ← エラー:まだ何も入ってない
配列っぽいけど、List の場合も サイズ確認せずに get() するとエラーになります!
対策
if (animals.size() > 0) {
System.out.println(animals.get(0));
}
エラーはパターンで見抜けるようになる
パターン | 典型的なコード例 | 対策 |
---|---|---|
最後のインデックス超え | nums[3] なのに length == 3 | length – 1 まで確認 |
ループ条件ミス | i <= array.length | i < array.length に修正 |
初期化のみ | new String[3] で中身はnull | 値を入れてから使う |
List空なのにget() | list.get(0) | size() > 0 で確認 |
この章のまとめ
- ArrayIndexOutOfBoundsException は「インデックスの使い方」に原因があることが多い
- エラーになるパターンを知っておくと、自分のコードを見直す視点が身につく
- コーディング中は「このインデックス、本当に存在する?」と立ち止まる癖が防御になる
エラーが出たら焦らずチェック!スタックトレースの読み方と原因の探し方
「Index out of bounds」って何がどう“アウト”なの?
Javaで配列やリストの操作中にエラーが出ると、よくこんな感じのメッセージを目にします。
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
at Main.main(Main.java:5)
ぱっと見「英語だし長いし怖い…」と感じてしまいがちですが、実はこのメッセージ、Javaからの丁寧なヒントの塊なんです。
スタックトレースの見方を覚えよう
エラーが出たら、見るべきポイントは主に3つ!
ポイント | 説明 |
---|---|
例外の種類 | ArrayIndexOutOfBoundsException(←これが何のエラーか) |
原因の詳細 | Index 3 out of bounds for length 3(←どこが範囲外?) |
発生場所 | Main.java:5(←何行目でエラーが出た?) |
解説
- Index 3 → 3番目(=4つ目)を見ようとした
- length 3 → 配列のサイズは3(=インデックスは 0, 1, 2 まで)
- Main.java:5 → ソースコードの5行目で発生!
たったこれだけで、「どの変数が」「なぜアウトだったのか」が読み取れるようになるんです。
実際のコードと照らし合わせてみる
public class Main {
public static void main(String[] args) {
int[] numbers = {10, 20, 30};
System.out.println(numbers[3]); // ← ここが5行目でエラー!
}
}
このコードとスタックトレースを見比べると、 「3番目の要素(4つ目)を参照しようとしてるけど、それは存在しないよ!」という意味がわかりますね。
エラーが出たときの確認ステップ
配列エラー調査5ステップ!
- スタックトレースからファイル名と行番号を確認する
- その行でどの配列 or リストを使っているかを見る
- lengthやsizeと比較して“あり得る番号か”を考える
- ループの条件や添え字の初期値・終値を確認する
- 配列・リストの初期化や追加漏れがないか見る
エラーメッセージは“友達”になれる!
最初は「なんだか怖いメッセージ」と思いがちですが、 実はJavaは 「ちゃんとエラーの場所と理由を教えてくれる親切な相棒」 なんです。
慣れてくると、スタックトレースの一行を見るだけで「あっ、これ配列のlength超えたな」とすぐ気づけるようになります。
まとめ
- ArrayIndexOutOfBoundsException が出たら、まず スタックトレースを読む
- 「何が」「どこで」間違っているかがヒントとして書かれている
- 冷静に原因を分解すれば、エラーは怖くない!
次章では、このエラーを未然に防ぐための書き方・習慣を解説していきます。
たとえば i < array.length のループの基本、size()チェック、List活用のヒントなど。
「そもそも事故を起こさない書き方」とは何か?を一緒に見ていきましょう
解決策まとめ ― このエラーをなくすためにできること
対策①:最大インデックスは「length – 1」!
まず覚えておきたいのは、Javaの配列は0から始まるということ。
例えば、 length が3の配列は、以下のように使えます
int[] data = {100, 200, 300};
// アクセス可能なのは 0, 1, 2 まで
System.out.println(data[2]); // OK
System.out.println(data[3]); // ❌ エラー!
対策のコツ
- 「配列の長さ=要素数」だけど、インデックスの上限は length – 1
- 「最大はどこまで?」と迷ったら length – 1 を紙に書くのも効果的!
対策②:ループ条件は「i < array.length」にする
初心者が最もやりがちなのが、この間違い
for (int i = 0; i <= array.length; i++) // ❌ = をつけるとアウト!
これは i == array.length のとき、範囲外の場所にアクセスしてしまうため、エラーになります。
正しい書き方はこれ
java
for (int i = 0; i < array.length; i++) // ⭕️ < にするのが鉄則
対策③:安全にアクセスしたいなら範囲チェックを入れる
何らかの理由で 不確実なインデックス番号 を使う場合は、ちゃんと範囲内かどうかを確認してからアクセスします。
int index = ...; // ユーザー入力や外部データなど
if (index >= 0 && index < array.length) {
System.out.println(array[index]); // 安全!
} else {
System.out.println("不正なインデックスです!");
}
入力エラー・APIレスポンスなど、外からの値には必ずガードをつける癖を!
対策④:List型なら size() を使うのが便利!
Javaの List クラスを使う場合も、 インデックス範囲は 0 ~ size()-1 です。
配列より柔軟なデータ構造ですが、エラーは同じように起きます。
List<String> fruits = new ArrayList<>();
fruits.add("りんご");
System.out.println(fruits.get(0)); // OK
System.out.println(fruits.get(1)); // ❌ エラー:IndexOutOfBounds
対策
java
if (index >= 0 && index < fruits.size()) {
System.out.println(fruits.get(index));
}
対策⑤:「値がないならアクセスしない」設計にしておく
例えば以下のように、空の配列や空のListを渡す設計にしておけば、null や予期せぬ範囲外を回避しやすくなります。
List<String> data = list == null ? Collections.emptyList() : list;
for (int i = 0; i < data.size(); i++) {
System.out.println(data.get(i));
}
このように、「空だったらアクセスしない」「存在する範囲だけ回す」ことで、そもそも範囲外にならない設計を心がけることができます。
エラーを防ぐ5つの知恵
対策 | 概要 |
---|---|
length – 1 を覚える | インデックスの最大値の基本 |
for文は < にする | ループ条件ミスを防ぐ |
範囲をチェックする | 外部からの値は必ず検証 |
size() を使いこなす | Listでも同じく範囲意識を |
「ないならアクセスしない」設計 | 未然に防ぐ書き方へシフト |
未然に防ぐコーディング習慣 ― インデックスとの“正しい距離感”を持とう
ArrayIndexOutOfBoundsException は一見、タイミングや打ち間違いの“うっかりミス”に思えます。
でも実は、日々のコーディング習慣やロジック設計の中にある“クセ”が原因であることも多いのです。
ここでは「事故を未然に防ぐ」ために身につけたい、5つの習慣をご紹介します。
習慣①:「ループ条件は常に < array.length」を体にしみ込ませる
for (int i = 0; i <= array.length; i++) // ❌ 危険
for (int i = 0; i < array.length; i++) // ⭕️ 安全
<= を使ってしまうと、最後に array[length] にアクセス → 範囲外!
i < array.length は Java界の“おまじない”だと思って、手が覚えるまで繰り返しましょう。
習慣②:Listや配列の要素を使うときは size や length を“信頼する”
if (list.size() > 0) {
System.out.println(list.get(0));
}
長さや要素数は自分で数えるのではなく、Javaの情報(length / size)を信じて使うほうが安全です。
特に外部からデータを受け取るときは、思ったより要素が少ない可能性もあるので注意!
習慣③:アクセス前に“範囲を確認”する癖を持つ
if (index >= 0 && index < array.length) {
System.out.println(array[index]);
}
ユーザーの入力や計算結果など、信頼できないインデックスには常にガードを置くべし。
ルール:「値を使う前に、“そのインデックスは本当にあるのか?”を確認する」
習慣④:そもそも「アクセスしなくても済む設計」を考える
java
// 悪い例:インデックス指定ありき
String getFirst(List<String> list) {
return list.get(0);
}
// 良い例:Optionalなどで“存在しないこと”を許容する
Optional<String> getFirstSafe(List<String> list) {
return list.stream().findFirst();
}
設計から「範囲外にならないようにする」ことで、エラーを根本から回避できるコードに!
習慣⑤:テストやログで“何が起きてるか”を見えるようにする
System.out.println("配列の長さ:" + array.length + " / アクセスするインデックス:" + index);
- 何かおかしいと感じたら、ログで要素数や条件を出力して確認する
- テストコードで「異常なインデックス」をあえて入力してみるのも◎
これにより、“どこで間違えたか”ではなく、“なぜ想定外の値になったのか”が見えてきます。
まとめ:「安全にコードを書く」ことは“相手を思いやる”ことに似ている
習慣 | 目的 |
---|---|
< array.length を使う | 基本ルールの徹底 |
length / size を信頼 | 正確な情報に基づいた判断 |
ガード条件を挟む | エラーを防ぐ予防策 |
設計からアクセスを見直す | 無理なロジックを減らす |
ログ・テストで検証する | 状況を“見える化”して把握する |
どの習慣も、日々のコードに小さく取り入れるだけで、エラーの発生率がグッと下がります。
そして、「自分の書いたコードが“誰かに読まれて使われる”」ことを意識できるようにもなりますよ!
エラーを学びに変える ― 配列と心がちょっと近づいた日
失敗したからこそ、理解できることがある
最初に ArrayIndexOutOfBoundsException に出会ったとき、 つまずいたことを覚えています。
けれど今は、エラーが起きた理由がわかります。
配列の範囲、インデックスの意味、for文の条件。
あのエラーは、自分のコードの“見直しポイント”を教えてくれていたんだと気づきました。
エラーは“止められた”のではなく、“教えてくれた”
Javaはとても優秀な相棒です。
範囲外を見ようとすると、「そこには何もないよ」とちゃんと教えてくれる。
それは私たちが危険なコードを書くのを防ぐ、“やさしいストッパー”なのかもしれません。
だから今では、エラーメッセージを読むたびに、 「Java様、教えてくれてありがとう」と思えるようになりました。
一歩ずつでもいい、自分のコードと向き合っていこう
プログラミングって、技術だけじゃなくて自分自身と向き合う行為でもあるということです。
- 自分の書いたコードがなぜ動かないのか
- どうしてこの変数に値がないのか
- どう直せばより良くなるのか
──そうやって考えることは、まるで“自分の頭の中を整理する時間”のようです。
あなたの「エラー体験」は、誰かの励みになる
もし今、この記事を読んで「自分も同じようなミスをしたな」と思ってくれたなら、 それはすでに学びの種を持っているということです。
この経験を、ノートに書き残してもいい。
ブログで発信してもいい。
Xで「#配列エラーあるある」なんてつぶやいてみてもいい。
きっとその経験が、あなたの未来のコードに活きてくるし、 同じところで悩んでいる誰かを助けるヒントにもなります。
最後に:配列と心、ちょっと近づけましたか?
ArrayIndexOutOfBoundsException は、たしかに面倒なエラーです。
でも、それをきっかけに配列を知り、インデックスを学び、Javaのルールにひとつずつ慣れていける。
この記事が、その小さな“気づきの灯り”になれたら嬉しいです!

「ArrayIndexOutOfBoundsException」は、私も何度もつまずいたエラーのひとつです。でも、ひとつひとつ原因を理解して、対策を覚えて、またコードを書いて…そんな繰り返しの中で、少しずつ自信がついてきました。今あなたが向き合っているエラーも、いつか必ず「学びに変わる経験」になります。完璧じゃなくても大丈夫。つまずいたぶんだけ、コードの見方が深くなっていきます。
コメント