Что означает ArrayIndexOutOfBoundsException
и как от него избавиться?
Вот пример кода, который вызывает исключение:
String[] name = { "tom", "dick", "harry" };
for (int i = 0; i <= name.length; i++) {
System.out.println(name[i]);
}
Первым пунктом назначения должна быть документация, которая достаточно ясно объясняет это:
Выбрасывается, чтобы указать, что к массиву был получен доступ с недопустимым индексом. Индекс либо отрицательный, либо больше или равен размеру массива.
Например:
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, сделайте это).
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++) {
Из этой прекрасной статьи: ArrayIndexOutOfBoundsException в цикл
Короче говоря:
В последней итерации
for (int i = 0; i <= name.length; i++) {
я
будет равно `имя.длина, которое является незаконным индексов, поскольку индексы массива начинаются с нуля.
Ваш код должен читать
for (int i = 0; i < name.length; i++)
^
Это означает, что вы пытаетесь получить доступ к индексу массива, который не является допустимым, так как он не находится между границами.
Например, это инициализирует массив примитивных целых чисел с верхней границей 4.
int intArray[] = new int[5];
Программисты считают с нуля. Поэтому, например, эта команда вызовет исключение ArrayIndexOutOfBoundsException
, поскольку верхняя граница равна 4, а не 5.
intArray[5];
Какие причины ArrayIndexOutOfBoundsException
?
Если вы считаете, переменной, как и "весне, где вы можете разместить значение, то массив представляет собой серию ящики, размещенные рядом друг с другом, где количество ящиков конечных и четкое число.
Создать массив такой:
final int[] myArray = new int[5]
создает строку из 5 коробок, и каждый держал инт
. Каждая из коробок имеет индекс, позиции в серии коробки. Этот индекс начинается с 0 и заканчивается N-1, где N-размер массива (количество коробок).
Для получения одного значения из этой серии ящиков, вы можете обратиться к нему по его индексу, например:
myArray[3]
Которые дадут вам значение 4-й коробки в серии (после первой коробки имеет индекс 0).
Ань 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) {
Таким образом, вы выиграли'т придется думать вообще об индексах.
При шлейфовании, что бы ты ни делал, не изменить значение итератора цикла (здесь: я
). Единственное место, это должно изменить значение, чтобы сохранить цикл происходит. Меняется он в противном случае просто рискуете исключение, и в большинстве случаев не обязательно.
Извлечение/обновление
Для получения произвольного элемента массива, всегда проверяйте, что оно является допустимым индексом в отношении длину массива:
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];
}
Чтобы избежать индекс массива вне границ исключение, необходимо использовать расширенная-за
заявление, где и когда они могут.
Основной мотивацией (и использовать), а при переборе и не требуют каких-либо сложных шагов итерации. Вы бы не может использовать расширенные- "за", чтобы перейти назад в массив или только перебирать каждый элемент.
Вы'вновь гарантированно не кончатся элементы для перебора при этом, и ваш [исправлено] пример легко превращается.
Приведенный ниже код:
String[] name = {"tom", "dick", "harry"};
for(int i = 0; i< name.length; i++) {
System.out.print(name[i] + "\n");
}
...эквивалентно этому:
String[] name = {"tom", "dick", "harry"};
for(String firstName : name) {
System.out.println(firstName + "\n");
}
В коде у вас есть обращались элементов с индексами от 0 до длины строки массива. имя.длина
дает количество объектов string в массив строковых объектов, то есть 3, но вы можете получить доступ только к имени индекса 2 [2]
,
потому что массив может быть доступна с индексами от 0 до имя.длина - 1
, где вы получите имя.длина ряда объектов.
Даже при использовании для
петли вы начали с индексом ноль и ты должен покончить с имя.длина - 1`. В массив A[N], где вы можете получить доступ к форма A[0] до А[П-1].
Например:
String[] a={"str1", "str2", "str3" ..., "strn"};
for(int i=0;i<a.length()i++)
System.out.println(a[i]);
В вашем случае:
String[] name = {"tom", "dick", "harry"};
for(int i = 0; i<=name.length; i++) {
System.out.print(name[i] +'\n');
}
Для данного массива длина массива составляет 3(т. е. имя.длина = 3). Но как он хранит элемента, начиная с индекса 0, то есть индекс максимум 2.
Таким образом, вместо 'я<=название.длина' вы должны написать 'я<имя.длина', чтобы не 'ArrayIndexOutOfBoundsException'.
Столько на этот простой вопрос, но я просто хотел выделить новую функцию на Java, которая поможет вам избежать путаницы вокруг индексации в массивах даже для начинающих. В Java-8 имеет абстрагировал задач итерации для вас.
int[] array = new int[5];
//If you need just the items
Arrays.stream(array).forEach(item -> { println(item); });
//If you need the index as well
IntStream.range(0, array.length).forEach(index -> { println(array[index]); })
Что'ей выгода? Ну, одна вещь, читабельность, как английский. Во-вторых, вам не нужно беспокоиться о ArrayIndexOutOfBoundsException
Вы получаете ArrayIndexOutOfBoundsException
из-за Я&л;=имя.длина часть. имя.длина
возвращает длину строки "имя", которое является 3. Следовательно, когда вы пытаетесь получить доступ к имени[3], Это'ы незаконным и бросает исключение.
Решены код:
String[] name = {"tom", "dick", "harry"};
for(int i = 0; i < name.length; i++) { //use < insteadof <=
System.out.print(name[i] +'\n');
}
Это's, определяемым в спецификация языка Java:
и GT; окончательные
поле длина
, в котором содержится ряд компонентов
из массива. "длина" может быть положительным или нулевым.
Что's, как этот тип исключения выглядит, когда брошенный в Eclipse. Числа в красный цвет знаменует индекс вы пытались открыть. Поэтому код будет выглядеть так:
myArray[5]
Ошибка возникает при попытке получить доступ к индексу, который не'т существуют в этом массиве. Если массив имеет длину 3,
int[] intArray = new int[3];
тогда только допустимые индексы:
intArray[0]
intArray[1]
intArray[2]
Если массив имеет длину 1,
int[] intArray = new int[1];
тогда единственный допустимый индекс является:
intArray[0]
Любое целое число, равна длине массива, или больше, чем: за пределы.
Любое целое число, меньшее, чем 0: запрещен;
P. S.: Если вы хотите лучше понять массивы и сделать некоторые практические упражнения, там'ы видео здесь: [учебник по массивам в Java][2]
[2]:
на "массивы в Java"иДля многомерных массивов, это может быть сложно, чтобы убедиться, что вы получаете доступ к свойство "length" правого измерения. Рассмотрим следующий код, например:
int [][][] a = new int [2][3][4];
for(int i = 0; i < a.length; i++){
for(int j = 0; j < a[i].length; j++){
for(int k = 0; k < a[j].length; k++){
System.out.print(a[i][j][k]);
}
System.out.println();
}
System.out.println();
}
Каждое измерение имеет разную длину, поэтому тонкая ошибка заключается в том, что среднее и внутреннее петель используйте свойство "length" той же размерности (потому что это[я].длина такая же как[Дж].длина`).
Вместо этого внутренний цикл должен использовать а[я][Дж].длина
(или A[0][0].длина
, для простоты).
ArrayIndexOutOfBounds означает, что вы пытаетесь индексировать позицию в массиве, не выделяется.
В этом случае:
String[] name = { "tom", "dick", "harry" };
for (int i = 0; i <= name.length; i++) {
System.out.println(name[i]);
}
Чтобы обойти это...
для(int я = 0; я<имя.длина; я++)`
Строка[] имя = {с "Томь" В, С "хер" В, С "Гарри", у }; для(строки n : имя) { Системы.из.метод println(Н); }
Строка[] имя = {с "Томь" В, С "хер" В, С "Гарри", у }; Массивы.asList(имя).(по каждому элементу системы.из::код println);
Строка[] имя = {с "Томь" В, С "хер" В, С "Гарри", у }; --- Массивы.asList(имя).трансляция().(по каждому элементу системы.из::код println); --- Поток.(имя).(по каждому элементу системы.из::код println);
ArrayIndexOutOfBoundsException, когда это исключение приходит, это означает, что вы пытаетесь использовать индекс массива, который находится за его пределами или на точки человека, которую вы запрашиваете больше, чем у вас инициализирован.
Чтобы предотвратить это, убедитесь, что вы не просите индекс которых нет в массиве, т. е. если длина массива равна 10, то ваш показатель должен находиться в диапазоне от 0 до 9
Самый распространенный случай-я'вэ видел, казалось бы, загадочные ArrayIndexOutOfBoundsExceptions, т. е. видимо не причинено свой собственный код обработки массива, является одновременное использование класса simpledateformat. Особенно в сервлете или контроллер:
public class MyController {
SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
public void handleRequest(ServletRequest req, ServletResponse res) {
Date date = dateFormat.parse(req.getParameter("date"));
}
}
Если два потока введите SimplateDateFormat.метод Parse() вместе вы, вероятно, увидеть ArrayIndexOutOfBoundsException. Обратите внимание на раздел синхронизации класс javadoc для класса simpledateformat.
Убедитесь, что нет места в коде, которые обращаются к теме небезопасные классы как класса simpledateformat, в параллельной манере, как в сервлете или контроллер. Проверить все переменные экземпляра сервлеты и контроллеры для вероятных подозреваемых.
ArrayIndexOutOfBoundsException
означает, что вы пытаетесь получить доступ к индексу массива, который не существует или находится вне границы массива. Индексы массивов начинаются с 0 и заканчивается на длина - 1.
В вашем случае
for(int i = 0; i<=name.length; i++) {
System.out.print(name[i] +'\n'); // i goes from 0 to length, Not correct
}
ArrayIndexOutOfBoundsException
происходит, когда вы пытаетесь получить доступ
имя.проиндексированных длина элемента, которая не существует (индекс массива заканчивается в длину -1). просто замена <= с < бы решить эту проблему.
for(int i = 0; i < name.length; i++) {
System.out.print(name[i] +'\n'); // i goes from 0 to length - 1, Correct
}
Для любой массив длины n, элементы массива будет иметь индекс от 0 до N-1.
Если ваша программа пытается получить доступ к любому элементу (или память), имеющих индекс массива больше, чем N-1, тогда Java будет бросать ArrayIndexOutOfBoundsException
Так вот два решения, которые мы можем использовать в программе
для(число типа int = 0; граф < массив.длина; счетчик++) { Системы.из.код println(массив[счетчик]); }
Или некоторые другие инструкции повтора как
тип int количество = 0; пока(граф < массив.длина) { Системы.из.код println(массив[счетчик]); счетчик++; }
для(строки STR : массива) { Системы.из.println(ул); }
Я вижу ответы на все вопросы, объясняя, как работать с массивами и как избежать индекса из исключений границы. Я лично избежать массивов любой ценой. Я использовать классы коллекций, которая позволяет избежать все глупости, что бы полностью разобраться с индексами массива. Эти циклические конструкции прекрасно работают с коллекциями, поддерживая код, который проще писать, понимать и поддерживать.
Каждый элемент в массиве называется элементом, и каждый элемент имеет доступ к его числовым индексом. Как показано на предыдущем рисунке, нумерация начинается с 0. 9-го элемента, к примеру, будет доступна с индексом 8.
Ошибка IndexOutOfBoundsException бросается, чтобы указать, что индекс какой-то (например в массив в строку или вектор) находится вне диапазона.
Любой массиве X, можно получить от [0 до (х. Длина - 1)]
Если вы используете массив's длина управлять итерации по петли, всегда помните, что индекс первого элемента в массиве 0. Поэтому индекс последнего элемента в массиве-на единицу меньше, чем массив's длина.