Что вызывает ArrayIndexOutOfBoundsException
?
Если вы думаете о переменной как о «ящике», в котором вы можете поместить значение, тогда массив - это серия ячеек, расположенных рядом друг с другом, где число ячеек является конечным и явным целым числом.
Создание массива, как это:
final int[] myArray = new int[5]
создает ряд из 5 ящиков, каждый из которых содержит int
. У каждого из ящиков есть индекс, позиция в ряду ящиков. Этот индекс начинается с 0 и заканчивается в N-1, где N - размер массива (количество блоков).
Чтобы извлечь одно из значений из этой серии блоков, вы можете обратиться к нему через его индекс, например:
myArray[3]
Что даст вам значение 4-го блока в серии (так как первый блок имеет индекс 0).
ArrayIndexOutOfBoundsException
Вызывается пытается retrive «ящик» , который не существует, путем передачи индекса , который выше , чем показатель прошлого «коробки», или отрицательным.
В моем работающем примере эти фрагменты кода выдают такое исключение:
myArray[5] //tries to retrieve the 6th "box" when there is only 5
myArray[-1] //just makes no sense
myArray[1337] //waay to high
Как избежать ArrayIndexOutOfBoundsException
Для предотвращения ArrayIndexOutOfBoundsException
есть несколько ключевых моментов, которые следует учитывать:
перекручивание
При циклическом просмотре массива всегда проверяйте, что индекс, который вы получаете, строго меньше, чем длина массива (количество блоков). Например:
for (int i = 0; i < myArray.length; i++) {
Обратите внимание <
, никогда не смешивайте =
там ..
Вы можете захотеть сделать что-то вроде этого:
for (int i = 1; i <= myArray.length; i++) {
final int someint = myArray[i - 1]
Просто не надо. Придерживайтесь приведенного выше (если вам нужно использовать указатель), и это избавит вас от боли.
Где возможно, используйте foreach:
for (int value : myArray) {
Таким образом, вам не придется думать об индексах вообще.
При выполнении цикла, что бы вы ни делали, НИКОГДА не меняйте значение итератора цикла (здесь:) i
. Единственное место, где это должно изменить значение, это поддерживать цикл. В противном случае это просто риск исключения, и в большинстве случаев это не обязательно.
Извлечение / обновление
При извлечении произвольного элемента массива всегда проверяйте, является ли он допустимым индексом по длине массива:
public Integer getArrayElement(final int index) {
if (index < 0 || index >= myArray.length) {
return null; //although I would much prefer an actual exception being thrown when this happens.
}
return myArray[index];
}