ArrayIndexOutOfBound исключение, хотя я проверяю длину массива! - PullRequest
0 голосов
/ 30 мая 2010

У меня есть следующий код в некоторых приложениях:

int lowRange=50;
int[] ageRangeIndividual = {6, 10, 18, 25, 45, 65, 90};
int index=0;
for (; index<ageRangeIndividual.length-1 && ageRangeIndividual[index]<=lowRange;index++);

Я получаю "Исключение в потоке" main "java.lang.ArrayIndexOutOfBoundsException: 7" в строке for! хотя я явно указываю прерывать цикл, если индекс <последний индексируемый элемент в массиве! </p>

Это не происходит всегда , но после некоторого времени запуска указанной программы (lowRange изменяется при каждом вызове функции)

Что я не вижу?

Ответы [ 2 ]

2 голосов
/ 30 мая 2010

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

index < ageRangeIndividual.length

Вы говорите, что это происходит в конце концов - у вас есть какие-то другие потоки, изменяющие значение index или ageRangeIndividual?

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

// Rename to something more appropriate, perhaps
public static int findIndexOverMinimum(int[] values, int minimum)
{
    for (int i = 0; i < values.length; i++)
    {
        if (values[i] > minimum)
        {
            return i;
        }
    }
    return -1; // Or throw an exception, whichever is most appropriate
}

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

0 голосов
/ 30 мая 2010

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

В этом случае индекс должен достигнуть 7 с последующей попыткой доступа, чтобы это произошло (превышает 0-6). Выражение ageRangeIndividual.length-1 даст 6 (количество элементов в массиве минус один), а выражение index<ageRangeIndividual.length-1 должно иметь значение false. В свою очередь, второе выражение после оператора && не должно оцениваться и поэтому не должно вызывать Exception в первую очередь.

Единственное, о чем я могу думать, это о том, отличается ли фактический код, который вы тестируете, или index<ageRangeIndividual.length-1 оценивается как задумано. В соответствии с приоритетом оператора (http://java.sun.com/docs/books/tutorial/java/nutsandbolts/operators.html) вычитание должно быть обработано первым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...