Как разрешить java.lang.IndexOutOfBoundsException: Index: 29, Size: 29 issue [duplicate]

слегка изменяющая функция пользователя

Сергей Пекар

  + (NSString *) parseISO8601Time: (NSString *) duration {NSInteger hours = 0;  NSInteger minutes = 0;  NSInteger seconds = 0;  // Получить часть времени из длительности отформатированного ISO 8601 http://en.wikipedia.org/wiki/ISO_8601#Durations if ([duration rangeOfString: @ "T"]. Location == NSNotFound || [dиапазон продолжительностиOfString: @ "P  "] .location == NSNotFound) {NSLog (@" Время не является частью продолжительности отформатированного ISO 8601 ");  return @ "0:00 Ошибка";  } duration = [duration substringFromIndex: [duration rangeOfString: @ "T"]. location];  while ([dлина продолжительности] & gt; 1) {// остается только одна буква после продолжительности синтаксического анализа = [dлительность подстрокиFromIndex: 1];  NSScanner * scanner = [[NSScanner alloc] initWithString: duration];  NSString * durationPart = [[NSString alloc] init];  [сканирование scanCharactersFromSet: [NSCharacterSet characterSetWithCharactersInString: @ "0123456789"] inString: & amp; durationPart];  Диапазон NSRangeOfDurationPart = [dиапазон продолжительностиOfString: durationPart];  if ((rangeOfDurationPart.location + rangeOfDurationPart.length) & gt; duration.length) {NSLog (@ "Время не является частью продолжительности отформатированного ISO 8601");  return @ "0:00 Ошибка";  } duration = [duration substringFromIndex: rangeOfDurationPart.location + rangeOfDurationPart.length];  if ([[duration substringToIndex: 1] isEqualToString: @ "H"]) {hours = [durationPart intValue];  } if ([[duration substringToIndex: 1] isEqualToString: @ "M"]) {minutes = [durationPart intValue];  } if ([[duration substringToIndex: 1] isEqualToString: @ "S"]) {seconds = [durationPart intValue];  }} if (hours! = 0) return [NSString stringWithFormat: @ "% ld:% 02ld:% 02ld", (long) hours, (long) minutes, (long) seconds];  else return [NSString stringWithFormat: @ "% ld:% 02ld", (long) minutes, (long) seconds];  }  
209
задан Infinite Recursion 20 October 2014 в 10:13
поделиться

15 ответов

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

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

Итак, например:

int[] array = new int[5]; int boom = array[10]; // Throws the exception

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

Одна из проблем, с которыми иногда сталкиваются люди, состоит в том, что массивы 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, сделайте это.)

213
ответ дан Makoto 15 August 2018 в 14:03
поделиться
  • 1
    Я бы добавил, что для многомерных массивов, которые могут иметь произвольную форму в Java, вложенные циклы должны проверять длину соответствующего подмассива: for (int nestedIndex = 0; nestedIndex < array[outerIndex].length; nestedIndex++) { ... array[outerIndex][nestedIndex] ... }. – Andrey 2 March 2017 в 23:04

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

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<name.length; i++) { System.out.print(name[i] +'\n'); }
-1
ответ дан Abhishek Agarwal 15 August 2018 в 14:03
поделиться

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

for(int i = 0; i < name.length; i++) { System.out.print(name[i] +'\n'); // i goes from 0 to length - 1, Correct }
1
ответ дан adn.911 15 August 2018 в 14:03
поделиться
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 - Основы языка - Массивы

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

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

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

for(int i = 0; i < name.length; i++) {
39
ответ дан BalusC 15 August 2018 в 14:03
поделиться

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

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

0
ответ дан Bill the Lizard 15 August 2018 в 14:03
поделиться

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

class demo{ public static void main(String a[]){ int[] numberArray={4,8,2,3,89,5}; int i; for(i=0;i<numberArray.length;i++){ System.out.print(numberArray[i+1]+" "); } }

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

0
ответ дан GT_hash 15 August 2018 в 14:03
поделиться

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

Основная мотивация (и прецедент) - это когда вы итерации, и вам не требуются сложные шаги итерации. Вы не сможете использовать расширенный 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"); }
6
ответ дан Lundin 15 August 2018 в 14:03
поделиться

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

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

1
ответ дан nIKHIL 15 August 2018 в 14:03
поделиться

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

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

int intArray[] = new int[5];

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

intArray[5];
11
ответ дан Octavian Damiean 15 August 2018 в 14:03
поделиться

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

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

Или это:

for (int i = 0; i < name.length; i++) { // ... }
3
ответ дан Peter Mortensen 15 August 2018 в 14:03
поделиться

Так много для этого простого вопроса, но я просто хотел выделить новую функцию на 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

1
ответ дан Satyendra Kumar 15 August 2018 в 14:03
поделиться

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

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

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

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

for(String i : name ) System.out.println(i);
0
ответ дан Stephen Rauch 15 August 2018 в 14:03
поделиться

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

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

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

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

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

for(int i = 0; i < name.length; i++) ^
16
ответ дан Teepeemm 15 August 2018 в 14:03
поделиться

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

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

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

final int[] myArray = new int[5]

создает строку из 5 полей, каждая из которых имеет int. Каждый из ящиков имеет индекс, позицию в ряду ящиков. Этот индекс начинается с 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, есть некоторые клавиши пункты:

Looping

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

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). Единственное место, которое должно изменить значение, это сохранить цикл.

Looping

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

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]; }
6
ответ дан Tobb 15 August 2018 в 14:03
поделиться
3
ответ дан Peter Mortensen 5 September 2018 в 13:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: