我在某个应用中有以下代码:
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都会有所不同)
我没看到什么?
答案 0 :(得分:2)
您发布的代码本身并不会引发异常。实际上,你的数组边界检查是一次性的 - 你太保守了,除非你真的不打算检查最后一个值。它通常只是
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
}
我真的不喜欢没有主体的循环,并且使用现有变量进行索引。这一切都完全有效,但感觉不对。
答案 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),应首先处理减法。