arrayindexoutofboundsexception的根本原因是索引超出0到array.length-1范围,主因是循环条件错误,调试需查堆栈、打印长度与索引,防御应校验参数并覆盖边界测试。

数组遍历中抛出 ArrayIndexOutOfBoundsException,根本原因是索引值脱离了合法区间——即不在 0 到 array.length - 1 之间。这不是随机错误,而是边界逻辑疏漏的明确信号。
循环条件写错是最高频原因
for 循环里一个符号之差,就可能越界:
- 正向遍历时误用
i ,正确应为 <code>i - 反向遍历时起点设成
array.length,实际应从array.length - 1开始 - 嵌套循环中,内层循环变量依赖外层索引但未校验长度,比如
arr[i][j]中j可能超出arr[i].length
动态索引必须显式校验
索引来自计算、输入或方法返回时,不能默认“它刚好合法”:
- 使用前加判断:
if (idx >= 0 && idx - 对取模、除法、偏移等运算结果特别警惕,例如
arr[i % n]安全,但arr[i + offset]需确认i + offset是否仍在范围内 - 从
split()或集合转来的数组,长度可能是 0,访问[0]前先判空
用更安全的遍历方式替代手写索引
不总需要下标,避开风险最直接:
- 只读遍历优先用增强 for 循环:
for (int x : arr),完全绕过索引管理 - 需索引又求稳,改用
List配合list.size()和list.get(i),语义更清晰 - 处理可能为空的场景,可用
Optional.ofNullable(arr).filter(a -> a.length > 0).map(a -> a[0]).orElse(null)
调试和防御习惯能快速定位并预防
异常堆栈第一行会明确指出哪行、哪个索引越界,这是最准的线索:
- 关键访问前打印
arr.length和当前索引值,比猜更快发现问题 - 方法接收数组参数时,开头就做非空和长度检查,抛出带上下文的
IllegalArgumentException - 测试时覆盖边界用例:空数组、单元素数组、索引为 0 或
length-1的情况











