即使我检查数组长度,ArrayIndexOutOfBound异常!

时间:2010-05-30 18:24:29

标签: java exception arrays

我在某个应用中有以下代码:

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

我在for行中得到了一个“线程异常”主“java.lang.ArrayIndexOutOfBoundsException:7”!即使我明确指定如果索引&lt;数组中的最后一个可索引项!

这不会发生总是,但在运行所述程序一段时间后(每次调用该函数时,lowRange都会有所不同)

我没看到什么?

2 个答案:

答案 0 :(得分:2)

您发布的代码本身并不会引发异常。实际上,你的数组边界检查是一次性的 - 你太保守了,除非你真的不打算检查最后一个值。它通常只是

index < ageRangeIndividual.length

你说它最终会发生 - 你有没有其他线程改变indexageRangeIndividual的价值?

我认为你将在下一行使用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
}

我真的不喜欢没有主体的循环,并且使用现有变量进行索引。这一切都完全有效,但感觉不对。

答案 1 :(得分:0)

当您引用的数组索引值超过其长度值减去1时,会出现ArrayIndexOutOfBoundsException(您基本上是在捕获不存在的内容)。

在这种情况下,索引需要达到7,然后才会发生访问尝试(超过0-6)。表达式ageRangeIndividual.length-1将给出6(数组中的元素数减去1),表达式index<ageRangeIndividual.length-1应该计算为false。反过来&amp;&amp;&amp;不应评估运算符,因此不应首先触发Exception

我唯一能想到的是您测试的实际代码是否不同,或者index<ageRangeIndividual.length-1是否按预期进行评估。根据运算符优先级(http://java.sun.com/docs/books/tutorial/java/nutsandbolts/operators.html),应首先处理减法。