Вопрос-ответ

What causes a java.lang.ArrayIndexOutOfBoundsException and how do I prevent it?

Что вызывает исключение java.lang.ArrayIndexOutOfBoundsException и как мне его предотвратить?

Что ArrayIndexOutOfBoundsException означает и как мне избавиться от этого?

Вот пример кода, который запускает исключение:

String[] names = { "tom", "bob", "harry" };
for (int i = 0; i <= names.length; i++) {
System.out.println(names[i]);
}
Переведено автоматически
Ответ 1

Вашим первым адресом вызова должна быть документация, которая объясняет это достаточно четко:


Выдается для указания того, что доступ к массиву осуществлялся с недопустимым индексом. Индекс либо отрицательный, либо больше или равен размеру массива.


Так, например:

int[] array = new int[5];
int boom = array[10]; // Throws the exception

Что касается того, как этого избежать ... гм, не делайте этого. Будьте осторожны с индексами массива.

Одна из проблем, с которой иногда сталкиваются люди, заключается в том, что они думают, что массивы проиндексированы на 1, например

int[] array = new int[5];
// ... populate the array here ...
for (int index = 1; index <= array.length; index++)
{
System.out.println(array[index]);
}

Это приведет к пропуску первого элемента (индекс 0) и вызовет исключение, когда индекс равен 5. Допустимые индексы здесь равны 0-4 включительно. Правильный идиоматический оператор for здесь будет:

for (int index = 0; index < array.length; index++)

(Это, конечно, при условии, что вам нужен индекс. Если вы можете вместо этого использовать расширенный цикл for, сделайте это.)

Ответ 2

В основном:

if (index < 0 || index >= array.length) {
// Don't use this index. This is out of bounds (borders, limits, whatever).
} else {
// Yes, you can safely use this index. The index is present in the array.
Object element = array[index];
}

В вашем конкретном случае,

for (int i = 0; i<=name.length; i++)

индекс включает длину массива. Это выходит за рамки. Вам нужно заменить <= на <.

for (int i = 0; i < name.length; i++)

Смотреть также:

Ответ 3

Из этой замечательной статьи: Исключение ArrayIndexOutOfBoundsException в цикле for

Вкратце:

На последней итерации

for (int i = 0; i <= name.length; i++) {

i будет равно name.length что является недопустимым индексом, поскольку индексы массива основаны на нуле.

Ваш код должен гласить

for (int i = 0; i < name.length; i++) 
^
Ответ 4

Это означает, что вы пытаетесь получить доступ к индексу массива, который недействителен, поскольку он не находится между границами.

Например, это инициализировало бы примитивный целочисленный массив с верхней границей 4.

int intArray[] = new int[5];

Программисты считают с нуля. Так что, например, это выдаст ArrayIndexOutOfBoundsException поскольку верхняя граница равна 4, а не 5.

intArray[5];
java arrays exception