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

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

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

 String[] name = {"tom", "dick", "harry"}; for(int i = 0; i<=name.length; i++) { System.out.print(name[i] +'\n'); } 

19 Solutions collect form web for “Что вызывает исключение java.lang.ArrayIndexOutOfBoundsException и как его предотвратить?”

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

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

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

 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++) 

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

 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]; } 

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

  • Учебники Java – Основы языка – Массивы

Обновление : согласно вашему fragmentу кода,

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

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

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

Короче говоря:

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

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

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

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

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

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

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

 int intArray[] = new int[5]; 

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

 intArray[5]; 

Чтобы исключить исключение индекса массива из-за пределов, следует использовать инструкцию расширенного типа, где и когда они могут.

Основная мотивация (и использование) – это когда вы выполняете итерацию, и вам не требуются какие-либо сложные шаги итерации. Вы не сможете использовать расширенный for перемещения назад в массив или только итерацию по каждому другому элементу.

При выполнении этого вы гарантированно не исчерпываете элементы для повторения, и ваш [исправленный] пример легко конвертируется.

Код ниже:

 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"); } 

Что вызывает ArrayIndexOutOfBoundsException ?

Если вы считаете переменную как «поле», где вы можете поместить значение, то массив представляет собой ряд ящиков, расположенных рядом с eachother, где число ячеек представляет собой конечное и явное целое число.

Создание массива следующим образом:

 final int[] myArray = new int[5] 

создает строку из 5 полей, каждая из которых содержит int . Каждый из ящиков имеет индекс, позицию в ряду ящиков. Этот индекс начинается с 0 и заканчивается на N-1, где N – размер массива (количество ящиков).

Чтобы получить одно из значений из этой серии ящиков, вы можете обратиться к нему через свой индекс, например:

 myArray[3] 

Который даст вам значение 4-го ящика в серии (поскольку первый ящик имеет индекс 0).

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

В моем примере выполнения эти fragmentы кода приведут к такому исключению:

 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++) { 

Обратите внимание на < , никогда не смешивайте a = там.

Возможно, вы захотите, чтобы у вас возникло желание сделать что-то вроде этого:

 for (int i = 1; i < = myArray.length; i++) { final int someint = myArray[i - 1] 

Только не надо. Придерживайтесь одного выше (если вам нужно использовать индекс), и это сэкономит вам много боли.

По возможности используйте foreach:

 for (int value : myArray) { 

Таким образом вам не придется вообще обдумывать индексы.

При циклизации, что бы вы ни делали, НИКОГДА не изменяйте значение iteratorа цикла (здесь: 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]; } 

В вашем коде вы получили доступ к элементам из индекса 0 в длину массива строк. name.length дает количество строковых объектов в вашем массиве строковых объектов, т. е. 3, но вы можете получить доступ только до имени индекса 2 name[2] , поскольку к массиву можно получить доступ с индекса 0 до name.length - 1 где вы получаете name.length количество объектов.

Даже при использовании цикла for вы начинаете с нулевого индекса, и вы должны заканчивать name.length - 1 . В массиве a [n] вы можете получить доступ к форме a [0] к [n-1].

Например:

 String[] a={"str1", "str2", str3" ..., "strn"}; for(int i=0;i 

В твоем случае:

 String[] name = {"tom", "dick", "harry"}; for(int i = 0; i< =name.length; i++) { System.out.print(name[i] +'\n'); } 

Так много для этого простого вопроса, но я просто хотел выделить новую функцию на 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 означает, что вы пытаетесь получить доступ к индексу массива, который не существует или не связан с границей этого массива. Индексы массива начинаются с 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 происходит, когда вы пытаетесь получить доступ к индексированному элементу name.length, который не существует (индекс массива заканчивается длиной -1). просто заменив < = на <, решит эту проблему.

 for(int i = 0; i < name.length; i++) { System.out.print(name[i] +'\n'); // i goes from 0 to length - 1, Correct } 

Наиболее распространенный случай, который я видел для кажущихся таинственными ArrayIndexOutOfBoundsExceptions, то есть, по-видимому, не вызванных вашим собственным кодом обработки массива, является одновременным использованием SimpleDateFormat. В частности, в сервлете или controllerе:

 public class MyController { SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy"); public void handleRequest(ServletRequest req, ServletResponse res) { Date date = dateFormat.parse(req.getParameter("date")); } } 

Если два streamа вступают в метод SimplateDateFormat.parse (), вы, скорее всего, увидите исключение ArrayIndexOutOfBoundsException. Обратите внимание на раздел синхронизации classа javadoc для SimpleDateFormat .

Удостоверьтесь, что в вашем коде нет места, которое будет обращаться к небезопасным classам streamов, таким как SimpleDateFormat, одновременно, как в сервлете или controllerе. Проверьте все переменные экземпляра ваших сервлетов и controllerов для вероятных подозреваемых.

Вы получаете ArrayIndexOutOfBoundsException из-за i< =name.length . name.length возвращает длину имени строки, которая равна 3. Следовательно, когда вы пытаетесь получить доступ к name[3] , оно является незаконным и генерирует исключение.

Решенный код:

 String[] name = {"tom", "dick", "harry"}; for(int i = 0; i < name.length; i++) { //use < insteadof <= System.out.print(name[i] +'\n'); } 

Он определен в спецификации языка Java :

public final length поля, которая содержит количество компонентов массива. length может быть положительной или нулевой.

Недостаточное исключение из массива

Вот как выглядит этот тип исключения при использовании Eclipse. Число в красном означает индекс, к которому вы пытались получить доступ. Таким образом, код будет выглядеть так:

 myArray[5] 

Ошибка вызывается при попытке получить доступ к индексу, который не существует в этом массиве. Если массив имеет длину 3,

 int[] intArray = new int[3]; 

то единственными действительными индексами являются:

 intArray[0] intArray[1] intArray[2] 

Если массив имеет длину 1,

 int[] intArray = new int[1]; 

то единственным действующим индексом является:

 intArray[0] 

Любое целое число, равное длине массива, или больше, чем оно: вне пределов.

Любое целое число меньше 0: вне пределов;

PS: Если вы хотите лучше понять массивы и выполнить некоторые практические упражнения, здесь есть видео: учебник по массивам на Java

Для данного массива длина массива равна 3 (т. Е. Name.length = 3). Но поскольку он хранит элемент, начинающийся с индекса 0, он имеет максимальный индекс 2.

Итак, вместо «i ** < = name.length» вы должны написать «i < ** name.length», чтобы избежать «ArrayIndexOutOfBoundsException».

Для любого массива длины n элементы массива будут иметь индекс от 0 до n-1.

Если ваша программа пытается получить доступ к любому элементу (или памяти) с индексом массива, большим, чем n-1, тогда Java будет вызывать ArrayIndexOutOfBoundsException

Итак, вот два решения, которые мы можем использовать в программе

  1. Поддержание счета:

     for(int count = 0; count < array.length; count++) { System.out.println(array[count]); } 

    Или какой-то другой оператор цикла, например

     int count = 0; while(count < array.length) { System.out.println(array[count]); count++; } 
  2. Лучший способ пойти с a для каждого цикла, в этом методе программисту не нужно беспокоиться о количестве элементов в массиве.

     for(String str : array) { System.out.println(str); } 

Имя ArrayIndexOutOfBoundsException объясняет, что если вы пытаетесь получить доступ к значению в индексе, который выходит за пределы массива Array, возникает такое исключение.

В вашем случае вы можете просто удалить знак равенства из цикла for.

 for(int i = 0; i 

Лучшим вариантом является итерация массива:

 for(String i : name ) System.out.println(i); 

Для многомерных массивов может быть сложно получить доступ к свойству 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 того же размера (поскольку length a[i].length той же a[j].length ).

Вместо этого для простоты внутренний цикл должен использовать a[i][j].length (или a[0][0].length ).

Эта ошибка возникает при переполнении циклов цикла. Давайте рассмотрим простой пример, подобный этому,

 class demo{ public static void main(String a[]){ int[] numberArray={4,8,2,3,89,5}; int i; for(i=0;i 

Сначала я инициализировал массив как «numberArray». то некоторые элементы массива печатаются с использованием цикла. Когда цикл запускает время «i», напечатайте элемент (numberArray [i + 1] .. (когда значение i равно 1, будет напечатан элемент numberArray [i + 1].) Предположим, что, когда i = (numberArray. length-2), последний элемент массива печатается. Когда значение «i» переходит к (numberArray.length-1), нет значения для печати. ​​В этот момент происходит «ArrayIndexOutOfBoundsException». Я надеюсь, что вы можете получить idea.thank вас!

Согласно вашему Коду:

 String[] name = {"tom", "dick", "harry"}; for(int i = 0; i< =name.length; i++) { System.out.print(name[i] +'\n'); } 

Если вы проверите System.out.print (name.length);

вы получите 3;

это означает, что длина вашего имени равна 3

ваш цикл работает от 0 до 3, который должен работать либо от «0 до 2», либо от «1 до 3»,

Ответ

 String[] name = {"tom", "dick", "harry"}; for(int i = 0; i 

Вы не могли перебирать или хранить больше данных, чем длина вашего массива. В этом случае вы можете сделать следующее:

 for (int i = 0; i < = name.length - 1; i++) { // .... } 

Или это:

 for (int i = 0; i < name.length; i++) { // ... } 
  • JSON Array итерация в Android / Java
  • Удалить элемент регулярного массива
  • Почему не конвертируется в ?
  • Может ли столбцы столбцов индекса PostgreSQL?
  • Присоединить элементы массива?
  • Как избежать исключения ArrayIndexOutOfBoundsException или IndexOutOfBoundsException?
  • Преобразовать ArrayList в String array
  • Каков максимальный размер, который может содержать массив?
  • Android-создать JSON-массив и объект JSON
  • Как преобразовать массив символов в строку?
  • Передача массива по ссылке
  • Давайте будем гением компьютера.