Java Lang Index Out of Bounds 例外の解決策

Mehvish Ashiq 2023年12月11日
  1. java.lang.IndexOutOfBoundsException の原因
  2. ArrayList を考慮した java.lang.IndexOutOfBoundsException の解決策
  3. 配列を考慮した java.lang.ArrayIndexOutOfBoundsException の解決策
Java Lang Index Out of Bounds 例外の解決策

今日は、Arrays と ArrayList を考慮した IndexOutOfBoundsException エラーについて説明します。 また、このエラーの原因と、最終的にそれを解決する方法も理解します。

java.lang.IndexOutOfBoundsException の原因

IndexOutOfBoundsException エラーが発生する理由は、ArraysArrayList で似ていますが、エラーの説明が異なるという 1つの違いがあります。 このエラーは、Arrays と ArrayList でそれぞれ java.lang.ArrayIndexOutOfBoundsExceptionjava.lang.IndexOutOfBoundsException として取得されます。

この例外の原因は次のとおりです。

  1. ArrayList が空の場合、最初のインデックス (0) の値にアクセスしようとします。
  2. 負のインデックスで Array または ArrayList の項目にアクセスしようとした場合。
  3. Array または ArrayList の無効なインデックスにアクセスしようとした場合。これは、Array または ArrayList のサイズに負の値、等しい、または大きい可能性があります。

IndexOutOfBoundsException は、コンパイル時に Java コンパイラによって検出されない実行時例外であることを思い出してください。 そのため、Array または ArrayList にアクセスする方法を知る必要があります。

経験則として、アクセスする前に Array または ArrayList に値を設定する必要があります。 さらに、0 <= index < (Array/ArrayList size)という条件を満たすインデックスにのみアクセスできます。

コード例の助けを借りてそれを学びましょう。

ArrayList を考慮した java.lang.IndexOutOfBoundsException の解決策

コード例:

import java.util.ArrayList;

public class TestArrayList {
  public static void main(String[] args) {
    ArrayList<String> list = new ArrayList<>();
    // we try to get value at index 0 which is
    // empty right now
    System.out.println(list.get(0));
    list.add("Mehvish"); // saves at index 0
    list.add("Ashiq"); // saves at index 1
  }
}

上記のコードは、まだ入力されていないインデックス 0 にアクセスしているため、IndexOutOfBoundsException エラーを引き起こしています。

このエラーを解決するには、最初に ArrayList に項目を追加し、次に無効なインデックスにアクセスしていないことを確認してそれらにアクセスする必要があります。 次のコードでは、IndexOutOfBoundsException を引き起こす可能性のあるすべての状況を処理しました。

コード例:

import java.util.ArrayList;

public class TestArrayList {
  // create array list object of String type
  static ArrayList<String> list = new ArrayList<>();

  // populate array list
  static void populateList() {
    list.add("Mehvish"); // saves at index 0
    list.add("Ashiq"); // saves at index 1
  }
  /*
  Access the index only if the index
  is valid and the list is not empty. Otherwise, print
  the message to inform the user
  */
  static void getElement(int index) {
    if (list.size() != 0 && index >= 0 && index < list.size()) {
      System.out.println(list.get(index));
    } else {
      System.out.println("The list is empty or you have entered an invalid index");
    }
  }
  // main method
  public static void main(String[] args) {
    populateList();
    getElement(0);
  }
}

このコードをさまざまな入力でテストしてみましょう。

テスト 1: ユーザーが 0getElement() 関数に渡すと、出力は次のようになります。

Mehvish

テスト 2: ユーザーが 1getElement() 関数に渡すと、出力は次のようになります。

Ashiq

テスト 3: ユーザーが 2getElement() 関数に渡すと、出力は次のようになります。

The list is empty or you have entered an invalid index

テスト 4: ユーザーが -1getElement() 関数に渡すと、出力は次のようになります。

The list is empty or you have entered an invalid index

テスト 5: ユーザーが populateList() 関数についてコメントし、有効なインデックスを渡します。 出力は次のようになります。

The list is empty or you have entered an invalid index

配列を考慮した java.lang.ArrayIndexOutOfBoundsException の解決策

コード例:

public class TestArray {
  public static void main(String[] args) {
    int array[] = {1, 2, 3, 4, 5};
    for (int i = 0; i <= array.length; i++) System.out.println(array[i]);
  }
}

このコード例では、無効なインデックス 5 にアクセスしようとしたため、ArrayIndexOfBoundsException が発生します。 無効なインデックスにはアクセスできないことに注意してください。

考えられるすべての状況を処理し、ArrayIndexOutOfBoundsException エラーを回避した次のコードをテストしてみましょう。

コード例:

import java.util.ArrayList;

public class TestArray {
  // required size of an array
  static int size = 2;
  // declare an int type array of specified size
  static int array[] = new int[size];

  // populate array
  static void populateArray() {
    for (int i = 0; i < size; i++) array[i] = i + 1;
  }

  // get element if a valid index is passed
  static void getElement(int index) {
    if (array.length != 0 && index >= 0 && index < array.length) {
      System.out.println(array[index]);
    } else {
      System.out.println("The array is empty or you have entered an invalid index");
    }
  }

  // main method
  public static void main(String[] args) {
    populateArray();
    getElement(1);
  }
}

このコードをさまざまなユーザー入力でテストしてみましょう。

テスト 1: ユーザーが 0getElement() 関数に渡すと、出力は次のようになります。

1

テスト 2: ユーザーが 1getElement() 関数に渡すと、出力は次のようになります。

2

テスト 3: ユーザーが 2getElement() 関数に渡すと、出力は次のようになります。

The array is empty or you have entered an invalid index

テスト 4: ユーザーが -1getElement() 関数に渡すと、出力は次のようになります。

The array is empty or you have entered an invalid index

テスト 5: ユーザーが populateArray() 関数についてコメントし、有効なインデックスを渡します。 出力は次のようになります。

0

なぜ0なのですか? これは、空の配列を初期化したためです。ここで、0 は int 型のデフォルト値です。 要素を初期化しない場合、数値配列要素のデフォルト値は 0 に設定され、参照要素は null に設定されます。

著者: Mehvish Ashiq
Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

関連記事 - Java Error

関連記事 - Java Exception