为何给数组按步长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
相关产品推荐
相关产品推荐

