Описание тега indexoutofboundsexception

Исключение, возникающее при попытке доступа к объекту, находящемуся за пределами контейнера. Общие контейнеры - это массивы или объекты на основе массивов. Это не зависящий от языка тег.

An IndexOutOfBoundsException- это исключение, которое возникает, когда вы пытаетесь получить доступ к объекту, находящемуся за пределами контейнера. Общие контейнеры - это массивы или объекты на основе массивов.

IndexOutOfBoundsExceptions обычно вызваны одной из двух причин...

  1. Передача отрицательного индекса указателя
  2. Передача указателя, который равен или больше длины контейнера.

Если мы воспользуемся примером массива, который определен как способный содержать 4 объекта...

Object[] myArray = new Object[4];

Массивы и контейнеры на основе массивов в большинстве языков имеют ссылки, начинающиеся с нуля ( список исключений см. В Википедии). Это означает, что первым элементом массива являетсяmyArray[0]не myArray[1]. Для начинающих программистов это часто неочевидно и может привести к тому, что они попытаются ссылаться на объекты из1-4 скорее, чем 0-3. Это приводит к тому, что программист получаетIndexOutOfBoundsException при попытке сослаться myArray[4].

Распространенный способ сделать эту ошибку - использовать for цикл следующим образом:

for (int i=0; i<=myArray.Length; i++)
    // do something with myArray[i];

Это не сработает с IndexOutOfBoundsException потому что только элементы [0] через [3] существовать. myArray[myArray.Length] является myArray[4], которого не существует.

Точно так же, пытаясь сослаться на отрицательный индекс, например myArray[-1]завершится ошибкой, так как существует за пределами массива. Обычно это происходит при попытке получить ссылку на индекс из другого метода, когда метод использует отрицательное число, чтобы указать на сбой.

Например, предположим, что следующий код...

String myName = "Fred";
Object myObject = myArray[myName.getIndexOf("B")];

В этом примере getIndexOf("B") метод найдет позицию буквы B в данном String. Однако при попытке использовать этот метод в приведенном выше коде букваB не встречается в слове Fred, поэтому он возвращает -1чтобы указать, что он не был найден. Если затем мы попытаемся использовать это значение в качестве ссылки на элемент массива, это не удастся.

Чтобы избежать этих исключений, обычно рекомендуется выполнить проверку перед попыткой ссылаться на элемент коллекции. Например...

int indexPointer = 2;
if (indexPointer >= 0 && indexPointer < myArray.length){
    // the index is within the bounds of the array
    Object myObject = myArray[indexPointer];
}

Канонический вопрос / ответы: