← 中文资源

简体中文版本

Java ArrayIndexOutOfBoundsException — 数组索引错误

通过访问前检查数组长度、循环上界用 < length,并优先使用增强 for 或集合,修复 ArrayIndexOutOfBoundsException。

阅读英文原文

症状

遇到“Java ArrayIndexOutOfBoundsException — 数组索引错误”时靠猜测只会浪费时间。请按证据排查:先复现症状,再执行针对性诊断,定位根因后修复,并用明确检查验证结果。

可观察到的症状包括:

  • java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 3
  • 堆栈精确指向数组访问行
  • 仅对较短输入才报错

诊断

先在隔离环境中复现故障,再按顺序执行以下检查,逐步缩小范围。

步骤 1

java -cp target/classes com.example.Main 2>&1 | grep OutOfBounds

消息给出索引与长度,可直接看出差一错误。

步骤 2

grep -rn "<= *.length\|length *+ *1" src/main/java

每处 <= length 或 length+1 的索引表达式都是边界缺陷候选。

常见诱因(按出现频率排序):

  • 循环上界用 index <= array.length 而非 <
  • 把基于 1 的计算用于 0 基数组
  • 参差数组的实际长度与假定的行长度不同

根因

Java 数组从 0 开始索引并在访问时做边界检查。任何小于 0 或大于等于 length 的索引都会抛 ArrayIndexOutOfBoundsException,最常见于差一的循环上界。

修复

使用 i < array.length,不需要索引时用增强 for,并用长度检查防护首/末元素访问。

注意:用 try/catch 吞掉异常会掩盖真实逻辑错误;应修正索引。

int[] values = getValues();

for (int i = 0; i < values.length; i++) { // < not <=
    System.out.println(values[i]);
}

// avoid indexing when iterating
for (int v : values) {
    System.out.println(v);
}

// guard first element
if (values.length > 0) {
    System.out.println(values[0]);
}

验证

用此前失败的输入重跑并确认无异常;为空数组与单元素数组补充测试。

修复后补充一条回归测试,复现原始症状,防止问题再次出现。

这类故障通常是环境问题而非纯逻辑错误,因此在缺陷记录中应写明完整命令、环境变量与工作目录。请用最小的脚本复现,待最小用例清楚后再扩大范围。为这类故障准备一份简短的排查清单,能显著减少下次排障时间。