You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何给数组按步长2赋值会导致后续for-each循环出现索引问题?

为什么给数组赋值为索引倍数后,for-each遍历会触发数组越界?

你遇到的问题根本不是for-each循环本身的问题,而是你在遍历过程中错误地把数组元素当成了数组索引来使用。

先看两种场景的代码对比:

示例1(正常运行)

你的代码应该是这样的:

int[] intArr = new int[10];
// 普通for循环赋值
for (int index = 0; index < intArr.length; index++) {
    intArr[index] = index; // 元素值等于索引
}
// for-each遍历
for (int num : intArr) {
    System.out.println(num); // 直接打印元素,逻辑正确
}

这里直接打印遍历到的元素,元素值范围0-9和数组合法索引范围一致,所以不会出现异常。

示例2(触发越界)

而出现异常的代码,大概率是写成了这样:

int[] intArr = new int[10];
for (int index = 0; index < intArr.length; index++) {
    intArr[index] = index * 2; // 元素值是索引的2倍
}
// 错误的遍历逻辑:用元素当索引访问数组
for (int num : intArr) {
    System.out.println(intArr[num]); // 此处触发越界
}

当index=5时,intArr[5]的值是10,而数组长度为10,合法索引范围是0-9。当for-each遍历到num=10时,intArr[10]就会触发ArrayIndexOutOfBoundsException。

关键原因

数组的元素值和索引是完全独立的两个概念:

  • 索引是数组中元素的位置标识,范围固定为0到数组长度-1
  • 元素值是你存在该位置的数据,可以是任何符合int类型范围的值

普通for循环里,你用的是合法索引(0到length-1)访问数组,所以不会越界;但如果在for-each里错误地把元素值当成索引使用,当元素值超出索引范围时,自然就会触发越界异常。

内容的提问来源于stack exchange,提问作者tsarac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 08:07:11