Что вызывает ArrayIndexOutOfBoundsException
?
Если вы рассматриваете переменную как «ящик», в который можно поместить значение, тогда массив представляет собой серию блоков, расположенных рядом сeachother, где число ячеек является конечным и явным целым числом.
Создание массива следующим образом:
final int[] myArray = new int[5]
создает строку из 5 ящиков, каждая из которых содержит int
.Каждый из ящиков имеет индекс, позицию в ряду ящиков.Этот индекс начинается с 0 и заканчивается N-1, где N - размер массива (количество ящиков).
Чтобы получить одно из значений из этой серии ящиков, вы можете обратиться кэто через его индекс, как это:
myArray[3]
, который даст вам значение 4-го блока в серии (так как первый блок имеет индекс 0).
An ArrayIndexOutOfBoundsException
вызвано попыткой извлечь «ящик», который не существует, путем передачи индекса, который выше индекса последнего «ящика», или отрицательным.
В моем работающем примере эти фрагменты кода будут производитьтакое исключение:
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];
}