Java
 Computer >> コンピューター >  >> プログラミング >> Java

JavaのArrayIndexOutOfBoundsExceptionとは?発生原因と対処法を解説

配列とインデックスの基本

配列(Array)とは、同じ型の要素を固定サイズで順番に格納するためのデータ構造(コンテナ/オブジェクト)です。配列のサイズ(長さ)は生成時に決定され、後から変更することはできません。

配列内の各要素の位置は「インデックス(添字)」と呼ばれます。Javaの配列は0始まりのため、最初の要素はインデックス0、2番目の要素はインデックス1、というように順に番号が割り当てられます。

JavaのArrayIndexOutOfBoundsExceptionとは?発生原因と対処法を解説

配列の各要素へは、「配列名[インデックス]」という形式の式を使ってアクセスします。

System.out.println(myArray[3]);
// 1457 が出力される

たとえばサイズ7の配列を作成した場合、その要素にアクセスできる有効なインデックスは a[0]〜a[6](長さ-1)までです。

ArrayIndexOutOfBoundsExceptionとは

ArrayIndexOutOfBoundsExceptionは、配列に存在しないインデックスでアクセスしようとした際にスローされる実行時例外(java.lang.RuntimeException のサブクラス)です。主に以下のようなケースで発生します。

  • 負の値(例:-1)をインデックスに指定した場合
  • 配列のサイズ以上の値(サイズが7の場合は7以上)をインデックスに指定した場合

例外の発生例

次のコードは、配列の要素一覧を表示した後、ユーザーにインデックスの入力を求め、その位置にある要素を出力するプログラムです。配列のサイズは7なので、有効なインデックスは0〜6です。

import java.util.Arrays;
import java.util.Scanner;
public class AIOBSample {
    public static void main(String args[]){
        int[] myArray = {1254, 1458, 5687, 1457, 4554, 5445, 7524};
        System.out.println("配列の要素は以下の通りです:");
        System.out.println(Arrays.toString(myArray));
        Scanner sc = new Scanner(System.in);
        System.out.println("取得したい要素のインデックスを入力してください:");
        int element = sc.nextInt();
        System.out.println("指定されたインデックスの要素は :: " + myArray[element]);
    }
}

しかし、下記の実行例ではインデックスとして7を入力しています。サイズ7の配列で有効なのは0〜6までなので、7は無効なインデックスとなり、ArrayIndexOutOfBoundsExceptionが発生してプログラムが異常終了します。

実行結果

実行時例外:

配列の要素は以下の通りです:
[1254, 1458, 5687, 1457, 4554, 5445, 7524]
取得したい要素のインデックスを入力してください:
7
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 7
    at AIOBSample.main(AIOBSample.java:12)

例外への対処法・回避策

1. インデックスの範囲を事前にチェックする

最も基本的な対策は、配列にアクセスする前に、インデックスが有効範囲内(0以上・length未満)であるかを確認することです。

if (element >= 0 && element < myArray.length) {
    System.out.println("指定されたインデックスの要素は :: " + myArray[element]);
} else {
    System.out.println("無効なインデックスです。0〜" + (myArray.length - 1) + "の範囲で指定してください。");
}

2. try-catchで例外を捕捉する

ユーザー入力のように、どうしても不正な値が渡る可能性がある場合は、try-catchで例外を捕捉し、適切なメッセージを表示してプログラムを継続させる方法もあります。

try {
    System.out.println("指定されたインデックスの要素は :: " + myArray[element]);
} catch (ArrayIndexOutOfBoundsException e) {
    System.out.println("無効なインデックスが指定されました:" + e.getMessage());
}

3. 拡張for文(for-each)を活用する

すべての要素を先頭から順に処理したいだけであれば、インデックスを扱わない拡張for文を使うことで、そもそもこの例外が発生する余地をなくすことができます。

for (int value : myArray) {
    System.out.println(value);
}

まとめ

ArrayIndexOutOfBoundsExceptionは、配列の有効なインデックス範囲(0〜length-1)の外にアクセスしたときに発生する実行時例外です。事前の範囲チェックやtry-catch、拡張for文の活用によって確実に回避できます。

  1. JavaのStringIndexOutOfBoundsExceptionとは?発生原因と対処法をわかりやすく解説

    StringIndexOutOfBoundsExceptionとはJavaにおいて、文字列(String)は一連の文字を格納するために使用され、オブジェクトとして扱われます。文字列は、java.langパッケージに含まれるStringクラスによって表現されます。文字列の作成方法は主に2つあります。1つは他のオブジェクトと同様にnewキーワードを使用する方法、もう1つはプリミティブ型のようにリテラルを直接代入する方法です。String stringObject = new String(Hello how are you); String stringLiteral = Welcome to T

  2. JavaのArrayIndexOutOfBoundsExceptionとは?発生原因と対処法を解説

    配列とインデックスの基本 配列(Array)とは、同じ型の要素を固定サイズで順番に格納するためのデータ構造(コンテナ/オブジェクト)です。配列のサイズ(長さ)は生成時に決定され、後から変更することはできません。 配列内の各要素の位置は「インデックス(添字)」と呼ばれます。Javaの配列は0始まりのため、最初の要素はインデックス0、2番目の要素はインデックス1、というように順に番号が割り当てられます。 配列の各要素へは、「配列名[インデックス]」という形式の式を使ってアクセスします。 System.out.println(myArray[3]); // 1457 が出力される たとえばサイズ7