Что ArrayIndexOutOfBoundsException
значит и как от этого избавиться?
Вот пример кода, который вызывает исключение:
String[] names = { "tom", "bob", "harry" };
for (int i = 0; i <= names.length; i++) {
System.out.println(names[i]);
}
Что ArrayIndexOutOfBoundsException
значит и как от этого избавиться?
Вот пример кода, который вызывает исключение:
String[] names = { "tom", "bob", "harry" };
for (int i = 0; i <= names.length; i++) {
System.out.println(names[i]);
}
i <= name.length
наi < name.length
- или лучше, напишите расширенный цикл for. (for (String aName : name) { ... }
)Ответы:
Ваш первый порт захода должен быть документацией, которая объясняет это достаточно ясно:
Так, например:
Что касается того, как этого избежать ... не делай этого. Будьте осторожны с вашими индексами массива.
Одна проблема, с которой иногда сталкиваются люди, - это думать, что массивы индексируются 1, например
Это упустит первый элемент (индекс 0) и выдаст исключение, когда индекс равен 5. Допустимые индексы здесь 0-4 включительно. Правильное идиоматическое
for
утверждение здесь будет следующим:( Конечно , при условии, что вам нужен индекс. Если вы можете использовать вместо этого расширенный цикл for, сделайте это.)
источник
for (int nestedIndex = 0; nestedIndex < array[outerIndex].length; nestedIndex++) { ... array[outerIndex][nestedIndex] ... }
.Смотрите также:
Обновление : согласно вашему фрагменту кода,
Индекс включает длину массива. Это за пределами. Вам нужно заменить
<=
на<
.источник
Из этой превосходной статьи: ArrayIndexOutOfBoundsException в цикле for
Короче говоря:
В последней итерации
i
будет равноname.length
недопустимому индексу, так как индексы массива начинаются с нуля.Ваш код должен читать
источник
Это означает, что вы пытаетесь получить доступ к индексу массива, который недопустим, поскольку он не находится между границами.
Например, это инициализирует примитивный массив целых чисел с верхней границей 4.
Программисты считают с нуля. Так что это, например, бросило бы
ArrayIndexOutOfBoundsException
как верхняя граница 4, а не 5.источник
Чтобы избежать исключения за пределами индекса массива, следует использовать расширенный
for
оператор, где и когда они могут.Основная мотивация (и вариант использования) - это когда вы выполняете итерацию, и вам не требуются какие-либо сложные шаги итерации. Вы не сможете использовать расширенный
for
для перемещения назад в массиве или только для итерации по каждому другому элементу.При этом вы гарантированно не исчерпаете элементы для повторения, и ваш [исправленный] пример легко преобразуется.
Код ниже:
... эквивалентно этому:
источник
Что вызывает
ArrayIndexOutOfBoundsException
?Если вы думаете о переменной как о «ящике», в котором вы можете поместить значение, тогда массив - это серия ячеек, расположенных рядом друг с другом, где число ячеек является конечным и явным целым числом.
Создание массива, как это:
создает ряд из 5 ящиков, каждый из которых содержит
int
. У каждого из ящиков есть индекс, позиция в ряду ящиков. Этот индекс начинается с 0 и заканчивается в N-1, где N - размер массива (количество блоков).Чтобы извлечь одно из значений из этой серии блоков, вы можете обратиться к нему через его индекс, например:
Что даст вам значение 4-го блока в серии (так как первый блок имеет индекс 0).
ArrayIndexOutOfBoundsException
Вызывается пытается retrive «ящик» , который не существует, путем передачи индекса , который выше , чем показатель прошлого «коробки», или отрицательным.В моем работающем примере эти фрагменты кода выдают такое исключение:
Как избежать
ArrayIndexOutOfBoundsException
Для предотвращения
ArrayIndexOutOfBoundsException
есть несколько ключевых моментов, которые следует учитывать:перекручивание
При циклическом просмотре массива всегда проверяйте, что индекс, который вы получаете, строго меньше, чем длина массива (количество блоков). Например:
Обратите внимание
<
, никогда не смешивайте=
там ..Вы можете захотеть сделать что-то вроде этого:
Просто не надо. Придерживайтесь приведенного выше (если вам нужно использовать указатель), и это избавит вас от боли.
Где возможно, используйте foreach:
Таким образом, вам не придется думать об индексах вообще.
При выполнении цикла, что бы вы ни делали, НИКОГДА не меняйте значение итератора цикла (здесь:)
i
. Единственное место, где это должно изменить значение, это поддерживать цикл. В противном случае это просто риск исключения, и в большинстве случаев это не обязательно.Извлечение / обновление
При извлечении произвольного элемента массива всегда проверяйте, является ли он допустимым индексом по длине массива:
источник
В вашем коде вы получили доступ к элементам от индекса 0 до длины массива строк.
name.length
дает число строковых объектов в вашем массиве строковых объектов, то есть 3, но вы можете получить доступ только до индекса 2name[2]
, потому что к массиву можно получить доступ от индекса 0 до того места,name.length - 1
где вы получаетеname.length
количество объектов.Даже при использовании
for
цикла вы начали с индекса ноль, и вы должны закончить сname.length - 1
. В массиве a [n] вы можете получить доступ от формы [0] к [n-1].Например:
В твоем случае:
источник
Для вашего данного массива длина массива равна 3 (то есть name.length = 3). Но поскольку он хранит элемент, начиная с индекса 0, он имеет максимальный индекс 2.
Таким образом, вместо «i ** <= name.length» вы должны написать «i <** name.length», чтобы избежать «ArrayIndexOutOfBoundsException».
источник
Так много для этого простого вопроса, но я просто хотел выделить новую функцию в Java, которая позволит избежать путаницы при индексации в массивах даже для начинающих. Java-8 абстрагировал задачу итерации для вас.
В чем выгода? Ну, одна вещь - это удобочитаемость, как на английском. Во-вторых, вам не нужно беспокоиться о
ArrayIndexOutOfBoundsException
источник
Вы получаете
ArrayIndexOutOfBoundsException
из-заi<=name.length
части.name.length
вернуть длину строкиname
, которая равна 3. Следовательно, когда вы пытаетесь получить доступname[3]
, это недопустимо и выдает исключение.Разрешенный код:
Это определено в спецификации языка Java :
источник
Вот как выглядит этот тип исключения, когда выдается в Eclipse. Цифра красного цвета обозначает индекс, к которому вы пытались получить доступ. Таким образом, код будет выглядеть так:
Ошибка выдается при попытке доступа к индексу, который не существует в этом массиве. Если массив имеет длину 3,
тогда единственные допустимые индексы:
Если массив имеет длину 1,
тогда единственный действительный индекс:
Любое целое число, равное длине массива или больше его: выходит за пределы.
Любое целое число меньше 0: выходит за пределы;
PS: Если вы хотите лучше понять массивы и выполнить некоторые практические упражнения, здесь есть видео: учебник по массивам в Java
источник
Для многомерных массивов может быть сложно получить доступ к
length
свойству нужного измерения. Возьмите следующий код для примера:Каждое измерение имеет различную длину, поэтому тонкая ошибка заключается в том, что средний и внутренний циклы используют
length
свойство одного и того же измерения (посколькуa[i].length
оно совпадает сa[j].length
).Вместо этого следует использовать внутренний цикл
a[i][j].length
(илиa[0][0].length
, для простоты).источник
Наиболее распространенный случай, который я видел для, казалось бы, загадочных ArrayIndexOutOfBoundsExceptions, то есть, по-видимому, не вызванных вашим собственным кодом обработки массивов, - это одновременное использование SimpleDateFormat. Особенно в сервлете или контроллере:
Если два потока введут метод SimplateDateFormat.parse () вместе, вы, скорее всего, увидите исключение ArrayIndexOutOfBoundsException. Обратите внимание на раздел синхронизации класса Javadoc для SimpleDateFormat .
Убедитесь, что в вашем коде нет места для одновременного доступа к небезопасным классам, таким как SimpleDateFormat, как в сервлете или контроллере. Проверьте все переменные экземпляра ваших сервлетов и контроллеров на наличие возможных подозреваемых.
источник
ArrayIndexOutOfBoundsException всякий раз, когда это исключение наступает, это означает, что вы пытаетесь использовать индекс массива, который выходит за его пределы или в терминах непрофессионала, вы запрашиваете больше, чем вы инициализировали.
Чтобы предотвратить это, всегда убедитесь, что вы не запрашиваете индекс, которого нет в массиве, т.е. если длина массива равна 10, тогда ваш индекс должен находиться в диапазоне от 0 до 9
источник
ArrayIndexOutOfBounds означает, что вы пытаетесь индексировать позицию в массиве, который не выделен.
В таком случае:
Чтобы обойти это ...
В вашем цикле for вы можете сделать i <name.length. Это предотвратит зацикливание на имени [3] и остановит на имени [2]
for(int i = 0; i<name.length; i++)
Используйте для каждого цикла
String[] name = { "tom", "dick", "harry" }; for(String n : name) { System.out.println(n); }
Используйте list.forEach (Consumer action) (требуется Java8)
String[] name = { "tom", "dick", "harry" }; Arrays.asList(name).forEach(System.out::println);
Конвертировать массив в поток - это хороший вариант, если вы хотите выполнить дополнительные «операции» с вашим массивом, например, фильтровать, преобразовывать текст, конвертировать в карту и т. Д. (Требуется Java8)
String[] name = { "tom", "dick", "harry" }; --- Arrays.asList(name).stream().forEach(System.out::println); --- Stream.of(name).forEach(System.out::println);
источник
ArrayIndexOutOfBoundsException
означает, что вы пытаетесь получить доступ к индексу массива, который не существует или находится за пределами этого массива. Индексы массива начинаются с 0 и заканчиваются длиной - 1 .В твоем случае
ArrayIndexOutOfBoundsException
происходит, когда вы пытаетесь получить доступ к индексируемому элементу name.length, который не существует (индекс массива заканчивается длиной -1). просто замена <= на <решит эту проблему.источник
Для любого массива длины n элементы массива будут иметь индекс от 0 до n-1.
Если ваша программа пытается получить доступ к любому элементу (или памяти) с индексом массива, превышающим n-1, Java выдаст исключение ArrayIndexOutOfBoundsException
Итак, вот два решения, которые мы можем использовать в программе
Ведение счета:
Или какое-то другое зацикливание
Лучший способ - использовать цикл для каждого цикла, в этом методе программисту не нужно беспокоиться о количестве элементов в массиве.
источник
Согласно вашему Кодексу:
Если вы проверяете System.out.print (name.length);
вы получите 3;
это означает, что ваше имя длина 3
Ваш цикл работает от 0 до 3, который должен быть либо "0 до 2", либо "1 до 3"
Ответ
источник
Каждый элемент в массиве называется элементом, и каждый элемент доступен по его числовому индексу. Как показано на предыдущем рисунке, нумерация начинается с 0 . Таким образом, к 9-му элементу, например, будет осуществляться доступ по индексу 8.
Выдается исключение IndexOutOfBoundsException, указывающее, что какой-то индекс (например, массив, строка или вектор) выходит за пределы допустимого диапазона.
Доступ к любому массиву X возможен от [0 до (X.length - 1)]
источник
Я вижу здесь ответы на все вопросы, объясняющие, как работать с массивами и как избегать исключений индекса за пределами границ. Я лично избегаю массивов любой ценой. Я использую классы Collections, что исключает всю глупость того, что приходится иметь дело с индексами массивов полностью. Циклические конструкции прекрасно работают с коллекциями, поддерживающими код, который легче писать, понимать и поддерживать.
источник
Если вы используете длину массива для управления итерацией цикла for , всегда помните, что индекс первого элемента в массиве равен 0 . Таким образом, индекс последнего элемента в массиве на единицу меньше длины массива.
источник
ArrayIndexOutOfBoundsException
само имя объясняет, что если вы пытаетесь получить доступ к значению в индексе, выходящему за рамки размера массива, то возникает такой тип исключения.В вашем случае вы можете просто удалить знак равенства из цикла for.
Лучший вариант - итерировать массив:
источник
Эта ошибка возникает при превышении лимита цикла выполнения. Давайте рассмотрим простой пример, подобный этому,
Сначала я инициализировал массив как numberArray. затем некоторые элементы массива печатаются с использованием цикла for. Когда цикл выполняется время 'i', выведите элемент (numberArray [i + 1] .. (когда значение i равно 1, элемент numberArray [i + 1] напечатан.) .. Предположим, что когда i = (numberArray. length-2), последний элемент массива печатается. Когда значение 'i' становится равным (numberArray.length-1), значение для печати отсутствует. В этом месте возникает ArrayIndexOutOfBoundsException. Надеюсь, вы могли бы получить идея. спасибо!
источник
Вы можете использовать Optional в функциональном стиле, чтобы избежать
NullPointerException
иArrayIndexOutOfBoundsException
:Вывод:
источник
Вы не можете перебирать или хранить больше данных, чем длина вашего массива. В этом случае вы можете сделать так:
Или это:
источник