Kwert-soft.ru

IT Софт для ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Java lang arrayindexoutofboundsexception 0

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

239 Aaron [2011-04-05 18:54:00]

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

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

java arrays indexoutofboundsexception

23 ответа

245 Решение Jon Skeet [2011-04-05 18:57:00]

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

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

Как избежать этого. um, не делайте этого. Будьте осторожны с индексами массива.

Одна проблема, с которой иногда сталкиваются люди, — это то, что массивы 1-индексируются, например.

Это пропустит первый элемент (индекс 0) и выдаст исключение, если индекс равен 5. Действительные индексы здесь 0-4 включительно. Правильный, идиоматический оператор for здесь:

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

45 BalusC [2011-04-05 18:59:00]

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

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

Индекс включает длину массива. Это за пределами. Вам нужно заменить на .

18 aioobe [2011-04-05 19:15:00]

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

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

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

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

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

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

9 Tobb [2016-01-19 19:55:00]

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

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

Создание такого массива:

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

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

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

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

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

Как избежать ArrayIndexOutOfBoundsException

Чтобы предотвратить ArrayIndexOutOfBoundsException , необходимо рассмотреть некоторые ключевые моменты:

Циклическое

При переходе по массиву всегда убедитесь, что индекс, который вы извлекаете, строго меньше длины массива (количество ящиков). Например:

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

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

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

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

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

При циклизации, что бы вы ни делали, НИКОГДА не изменяйте значение итератора цикла (здесь: i ). Единственное место, которое должно изменить значение, это сохранить цикл. Изменение в противном случае просто рискует исключением и в большинстве случаев не обязательно.

индексирование/обновление

При получении произвольного элемента массива всегда проверяйте, что он является допустимым индексом по отношению к длине массива:

9 Makoto [2015-10-17 00:45:00]

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

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

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

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

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

3 nIKHIL [2018-01-16 15:13:00]

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

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

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

2 Ion [2017-03-08 15:56:00]

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

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

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

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

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

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

Читать еще:  Embedded database java

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

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

Так много для этого простого вопроса, но я просто хотел выделить новую функцию на Java, которая позволит избежать всех путаниц в индексировании в массивах даже для новичков. Java-8 абстрагировала задачу итерации для вас.

Какая польза? Ну, с одной стороны, это читаемость, как английский. Во-вторых, вам не нужно беспокоиться о ArrayIndexOutOfBoundsException

ArrayIndexOutOfBounds означает, что вы пытаетесь проиндексировать позицию в массиве, который не выделен.

  • name.length равен 3, так как массив был определен с 3 объектами String.
  • При доступе к содержимому массива позиция начинается с 0. Так как есть 3 элемента, это будет означать name [0] = «tom», name [1] = «dick» и name [2] = «harry
  • Когда вы зацикливаетесь, так как я могу быть меньше или равен name.length, вы пытаетесь получить доступ к имени [3], которое недоступно.

Чтобы обойти это.

В вашем цикле for вы можете сделать я for(int я = 0; i

Используйте для каждого цикла

String[] name = < "tom", "dick", "harry" >; for(String n: name)

Используйте 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);

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

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

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

Для многомерных массивов может быть сложно получить доступ к свойству length правого измерения. Возьмем следующий код, например:

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

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

1 sgrpwr [2018-09-15 13:29:00]

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

Чтобы это предотвратить, всегда убедитесь, что вы не запрашиваете индекс, который отсутствует в массиве, т.е. Если длина массива равна 10, то ваш индекс должен находиться в диапазоне от 0 до 9

0 Mohit [2016-11-11 11:21:00]

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

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

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

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

Лучший способ пойти с a для каждого цикла, в этом методе программисту не нужно беспокоиться о количестве элементов в массиве.

0 adn.911 [2017-11-30 19:41:00]

ArrayIndexOutOfBoundsException означает, что вы пытаетесь получить доступ к индексу массива, который не существует или не связан с границей этого массива. Индексы массивов начинаются с и заканчиваются на длина — 1.

ArrayIndexOutOfBoundsException происходит, когда вы пытаетесь получить доступ индексированный элемент name.length, который не существует (индекс массива заканчивается на -1). просто заменяя Оригинал ответа (на английском)

Я вижу все ответы здесь, объясняющие, как работать с массивами и как избегать исключений индекса за пределами границ. Я лично избегаю массивов любой ценой. Я использую классы Collections, что исключает всю глупость необходимости полностью разбираться с индексами массивов. Циклические конструкции прекрасно работают с коллекциями, поддерживающими код, который легче писать, понимать и поддерживать.

0 ZiadM [2018-10-18 12:24:00]

Каждый элемент в массиве называется элементом, и каждый элемент получает доступ к его числовому индексу. Как показано на предыдущей иллюстрации, нумерация начинается с 0. Таким образом, к девятому элементу, например, следует обращаться по индексу 8.

IndexOutOfBoundsException выводится, чтобы указать, что индекс какого-либо типа (например, массив, строка или вектор) выходит за пределы диапазона.

К любому массиву X можно получить доступ с [0 до (X.length — 1)]

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

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

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

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

Ответ

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

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

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

-1 GT_hash [2018-07-17 06:03:00]

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

Читать еще:  Enum valueof java

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

-3 Kevin7 [2016-01-19 19:26:00]

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

Solving java.lang.ArrayindexOutOfBoundsException: 1 in Java

The error ArrayIndexOutOfBoundsException : 1 means index 1 is inval >ArrayIndexOutfBoundsException comes when your code, mostly for loop tries to access an inval >IndexOutOfBoundsException which is used to throw error related to invalid index e.g. try to access outside of length in String etc.

An array is a data structure which is the base for many advanced data structure e.g. list, hash table or a binary tree. The array stores elements in the contiguous memory location and it can also have multiple dimension e.g. a two-dimensional array. You can use the 2D array to represent matrix, a board in games like Tetris, Chess and other board games.

A good knowledge of data structure and the algorithm is a must for any good programmer. You should read a good introductory book e.g. Introduction to Algorithms by Thomas Cormen to learn more about array in Java.

Understanding ArrayIndexOutOfBoundsException

This error comes when you are accessing or iterating over array directly or indirectly. Directly means you are dealing with array type e.g. String[] or main method, or an integer[] you have created in your program. Indirectly means via Collection classes which internally use an array e.g. ArrayList or HashMap.

Now let’s understand what information the associated error message gives us:
java.lang.ArrayIndexOutOfBoundsException: 0 means you are trying to access index 0 which is invalid, which in turn means the array is empty.

Here is a Java program which reproduces this error by accessing the first element of the empty array i.e. array with zero length:

You can see the accessing first element of an empty array resulted in the ArrayIndexOutOfBoundsException in Java.

java.lang.ArrayindexOutOfBoundsException: 1 means index 1 is invalid, which in turn means array contains just one element. Here is a Java program which will throw this error:

Similarly, java.lang.ArrayIndexOutOfBoundsException: 2 means index 2 is invalid, which means array has just 2 elements and you are trying to access the third element of the array.

Sometimes when a programmer makes switch from C/C++ to Java they forget that Java does the bound checking at runtime, which is a major difference between C++ and Java Array. You should read Core Java Volume 1 By Cay S. Horstmann if you are learning Java and knows C++. The author often highlights the key difference between C++ and Java while teaching important concepts.

Here is nice slide of some good tips to avoid ArrayIndexOutOfBondsException in Java:

How to avoid ArrayIndexOutOfBoundsException in Java

In order to avoid the java.lang.ArrayIndexOutOfBoundsException, you should always do the bound check before accessing array element e.g.

Always remember that array index starts at 0 and not 1 and an empty array has no element in it. So accessing the first element will give you the java.lang.ArrayIndexOutOfBoundsException : 0 error in Java.

You should always pay to one-off errors while looping over an array in Java. The programmer often makes mistakes which result in either missing first or last element of the array by messing 1st element or finishing just before the last element by incorrectly using the , >= or operator in for loops. For example, following program will never print the last element of the array. The worst part is there won’t be any compile time error or runtime exception. It’s pure logical error which will cause incorrect calculation.

You can see the first element of array i.e. 2 is never get printed. There is no compile time or runtime error, though.

Here are few handy tips to avoid ArrayIndexOutOfBoundsException in Java:

  1. Always remember that array is zero based index, first element is at 0th index and last element is at length — 1 index.
  2. Pay special attention to start and end condition of loop.
  3. Beware of one-off errors like above.

Понимание Array IndexOutofbounds Исключение в Java

Java поддерживает создание и манипулирование массивами , как структуру данных. Индекс массива — это целочисленное значение, значение которого находится в интервале [0, n-1], где n — размер массива. Если сделан запрос на отрицательный или индекс, который больше или равен размеру массива, то JAVA выдает исключение ArrayIndexOutOfBounds. Это не похоже на C / C ++, где не выполняется проверка индекса привязки.

ArrayIndexOutOfBoundsException — исключение времени выполнения, выдаваемое только во время выполнения. Компилятор Java не проверяет эту ошибку во время компиляции программы.

// Индекс общей причины выходит за пределы

public class NewClass2

Читать еще:  Thread sleep java

public static void main(String[] args)

for ( int i= 0 ; i

Ошибка выполнения выдает исключение:

Выход:

Здесь, если вы внимательно посмотрите, массив имеет размер 5. Следовательно, при доступе к его элементу с помощью цикла for максимальное значение индекса может быть 4, но в нашей программе оно увеличивается до 5 и, следовательно, является исключением.

Давайте посмотрим еще один пример использования arraylist:

// Еще один пример с индексом вне границ

public class NewClass2

public static void main(String[] args)

ArrayList lis = new ArrayList<>();

Ошибка выполнения здесь немного более информативна, чем предыдущая

Давайте поймем это немного подробнее

  • Индекс здесь определяет индекс, к которому мы пытаемся получить доступ.
  • Размер дает нам информацию о размере списка.
  • Поскольку размер равен 2, последний индекс, к которому мы можем получить доступ (2-1) = 1, и, следовательно, исключение

Правильный способ доступа к массиву:

Обработка исключения:

  • Использовать цикл for-each : он автоматически обрабатывает индексы при доступе к элементам массива. Пример-
  • Используйте Try-Catch: рассмотрите возможность включения вашего кода в оператор try-catch и соответственно обработайте исключение. Как уже упоминалось, Java не позволит вам получить доступ к недопустимому индексу и обязательно выдаст исключение ArrayIndexOutOfBoundsException. Однако мы должны быть осторожны внутри блока оператора catch, потому что, если мы не обработаем исключение надлежащим образом, мы можем скрыть его и, таким образом, создать ошибку в вашем приложении.

Эта статья предоставлена Rishabh Mahrsee . Если вам нравится GeeksforGeeks и вы хотите внести свой вклад, вы также можете написать статью и отправить ее по почте на contrib@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Common reasons of java.lang.ArrayIndexOutOfBoundsException in Java

The ArrayIndexOutOfBoundsException, also known as java.lang.ArrayIndexOutOfBoundsExcepiton is one of the most common errors in Java program. It occurs when Java program tries to access an inval >String[] name = <"abc">then trying to access name[1] will give java.lang.ArrayIndexOutOfBoundsException: length=1; index=1 error because index 1 is invalid here. Why? because index in Java array starts with zero rather than 1, hence in an array of just one element the only valid index is index zero. This was one of the most common scenarios which cause several million of ArrayIndexOutOfBoundsException daily. Sometimes it just a plain programming error but sometimes if an array is populated outside and if there is an error on feed than also you get java.lang.ArrayIndexOutOfBoundsException in Java.

In this article, I will share with you some of the common reasons of ArrayIndexOutOfBoundsExcpetion and their solution. This will give you enough experience to deal with this error in future.

In order to solve ArrayIndexOutOfBoundsException, just remember following key details about array in Java:

1) The array index in Java starts at zero and goes to length — 1 , for example in an integer array int[] primes = new int[10] , the first index would be zero and last index out be 9 (10 -1)

2) Array index cannot be negative, hence prime[-1] will throw java.lang.ArrayIndexOutOfBoundsException .

3) The maximum array index can be Integer.MAX_VALUE -1 because the data type of index is int in Java and the maximum value of int primitive is Integer .MAX_VALUE. See Big Java: Early Objects, 5th edition by Cay S. Horstmann to learn more about array data structure in Java.

Now, let’s see some of the common examples of ArrayIndexOutOfBoundsException in Java

java.lang.ArrayIndexOutOfBoundsException length=0 index=0

This is the classic case of accessing an empty array. Since length is zero it means the array is empty and the index is zero means we are trying to access the first element of the array. This happens when you try to access an array without checking its length, as shown below.

When you run this program you will get following error:

A solution to this problem is to always access array after checking array length, as shown in the good code snippet.

java.lang.ArrayIndexOutOfBoundsException: length=1; index=1

This the second most popular reason of ArrayIndexOutOfBoundsException in Java. Here you are trying to access an array by its length. If you remember, the maximum val >index = length then you get this error. This usually happens when you use or >= sign in for loop while looping over an array in Java.

If you run this code, you will get following error :

This is because 10 is not a valid index for an array of length 10. The valid index is only from 0 to 9. See a good data structure book e.g. Introduction to Algorithm to learn more about array data structure in general.

This is the third common reasons of millions of ArrayIndexOutOfBoundsException. In this case, you are trying to access the array using a negative index. There could be different reasons why index becomes negative but the bottom line is you should not access an array with the negative index.

Ссылка на основную публикацию
Adblock
detector