Java for循环未终止且抛出ArrayOutOfBoundsException的原因是什么?
问题根因
你代码的核心问题出在for循环的终止条件校验逻辑不匹配实际下标访问范围:
- 循环当前终止条件仅保证
i < iValues.length,仅能确保iValues[i]访问合法 - 但循环体内实际还访问了
iValues[i+1],当i等于数组最大合法下标(即iValues.length - 1)时,i+1等于数组长度,超出了Java数组的合法下标范围(数组下标从0开始,最大为长度减1),就会抛出ArrayIndexOutOfBoundsException。
结合你给出的奇数长度测试场景举例验证:假设传入长度为3的数组,最大合法下标为2,i的遍历序列为1、3:
- 当i=1时符合
i<3的条件,i+1=2访问合法 - 当i自增到3时才会退出循环,但如果中间出现步长异常(比如你尝试在循环体中额外递增i),就会让i提前到达2,触发
i+1=3的越界问题。
修复方案
直接调整for循环的终止条件,确保i+1也在合法下标范围内即可,修改后代码如下:
for (int i = 1; i + 1 < iValues.length; i = i + 2) { g.addEdge(iValues[0], iValues[i], iValues[i + 1]); }
其他注意事项
- 不要在循环体内部额外对i进行递增,会打乱原本设定的步长逻辑,反而更容易触发下标异常
- 若你的业务逻辑要求每次取两个相邻元素作为参数,该修改后的逻辑兼容奇数、偶数长度的数组,且会正常终止,不会出现死循环问题。
内容的提问来源于stack exchange,提问作者jhroutzong
相关产品推荐
相关产品推荐

