JavaのIndexOutOfBoundsExceptionを完全ガイド!初心者でも理解できる例外処理と回避方法
Javaの基礎を体系的に整理しながら学習したい方には、 資格対策としても定評のある定番教材が参考になります。
Javaプログラマ Silver SE 17 教科書をAmazonで見る※ Amazon広告リンク
生徒
「Javaのプログラムを実行していたら、IndexOutOfBoundsExceptionっていうエラーが出て止まってしまいました。これはどういう意味なんですか?」
先生
「IndexOutOfBoundsExceptionは、Javaで配列や文字列などの要素を扱うときに、存在しない位置にアクセスしようとしたときに発生する例外です。初心者がつまずきやすいポイントなので、しっかり理解しておきましょう。」
生徒
「なるほど。じゃあ、どんなときに発生するのか具体的に知りたいです!」
先生
「それでは、基本的な使い方と発生するケースを例を交えて解説していきますね。」
1. IndexOutOfBoundsExceptionとは?
JavaのIndexOutOfBoundsExceptionは、配列やリスト、文字列のインデックスが範囲外になったときにスローされるランタイム例外です。このクラスはjava.langパッケージに含まれており、特別なインポートをしなくても自動的に使える仕組みになっています。例えば、配列の要素が3つしかないのに、4番目を取得しようとした場合に発生します。
2. 配列でのIndexOutOfBoundsException
最もよくあるのが配列のアクセス時です。配列のインデックスは必ず0から始まり、要素数−1までしか使えません。初心者は「要素数と同じインデックスまで使える」と勘違いしやすいので注意が必要です。
public class ArrayExample {
public static void main(String[] args) {
int[] numbers = {10, 20, 30};
System.out.println(numbers[3]); // 存在しないインデックス
}
}
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
このように、配列の範囲を超えるインデックスを指定するとエラーが発生します。配列の長さはlengthプロパティで確認できるため、必ず範囲内かを意識しましょう。
3. 文字列でのIndexOutOfBoundsException
Stringクラスのメソッドでも範囲外アクセスは起こります。特にcharAtやsubstringで発生しやすいです。
public class StringExample {
public static void main(String[] args) {
String text = "Java";
System.out.println(text.charAt(4)); // 存在しない文字
}
}
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: Index 4 out of range for length 4
文字列は長さ4ですが、インデックスは0から3までしか使えません。これを知らないと簡単にエラーが出てしまうため、必ずlength()メソッドで長さを確認してから使いましょう。
4. リストやコレクションでのIndexOutOfBoundsException
JavaのArrayListや他のコレクションでも、インデックス範囲外アクセスで同じ例外が発生します。配列と違って要素を動的に追加できるリストでも、存在しない位置を指定するとエラーになります。
import java.util.ArrayList;
import java.util.List;
public class ListExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
System.out.println(list.get(2)); // 存在しない要素
}
}
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 2 out of bounds for length 2
コレクション操作では、要素数をsize()メソッドで確認してからインデックスを指定する習慣をつけると安全です。
5. IndexOutOfBoundsExceptionを回避する方法
この例外を避けるためには、必ずインデックスが範囲内かを確認することが重要です。次のような方法があります。
- 配列なら
lengthプロパティを利用する - 文字列なら
length()メソッドで確認する - リストなら
size()メソッドを利用する
public class SafeExample {
public static void main(String[] args) {
String text = "Java";
int index = 3;
if (index < text.length()) {
System.out.println(text.charAt(index));
} else {
System.out.println("範囲外アクセスです");
}
}
}
a
このように条件分岐を入れることで、不要な例外を防ぐことができます。例外処理としてtry-catchを使う方法もありますが、基本的には事前に範囲を確認するのがベストプラクティスです。
6. try-catchでの例外処理
場合によっては、プログラムを止めずに例外を処理したいこともあります。そのときにはtry-catch構文を使います。
public class TryCatchExample {
public static void main(String[] args) {
int[] numbers = {1, 2, 3};
try {
System.out.println(numbers[5]);
} catch (IndexOutOfBoundsException e) {
System.out.println("例外が発生しました: " + e.getMessage());
}
}
}
例外が発生しました: Index 5 out of bounds for length 3
このように、エラーが出てもプログラムを続行できます。ただし、例外処理に頼るのではなく、正しいインデックス管理を心がけることが大切です。
7. 初心者が注意すべきポイント
初心者がよく間違えるのは、配列や文字列の長さを正しく理解していないことです。例えば、要素数が3の配列に対して「3番目まである」と考えてしまうケースです。しかし、実際には0から始まるので最後の要素はインデックス2になります。このズレがIndexOutOfBoundsExceptionの最大の原因です。
また、文字列のsubstringを使うときに、終了インデックスを誤って指定すると例外が出ることもあります。特にループ処理やユーザー入力を扱うときは必ず境界チェックを入れる習慣を持ちましょう。