ArrayIndexOutOfBoundsException 是运行时异常,因数组下标越界触发,编译器不检查索引合法性,仅验证语法与类型;常见于循环边界错误、空数组访问等场景,需通过边界校验、工具方法和单元测试预防。

ArrayIndexOutOfBoundsException 是什么,为什么总在运行时才报?
它不是编译错误,而是 RuntimeException 的子类,JVM 在数组访问越界时才抛出。Java 编译器不检查 array[i] 中的 i 是否合法,只确保语法和类型正确——所以写错下标、循环多跑一次、空数组取 [0],全得等到运行时才崩。
最常见的触发场景和对应修复方式
多数问题集中在边界判断缺失或逻辑错位。下面这些情况反复出现:
- 循环条件写成
i (应为),导致访问array[array.length] - 对空数组调用
array[0],没提前判array.length == 0 - 从用户输入、文件读取或 API 返回中拿到索引值,没做范围校验(比如输入
"10"但数组只有 5 个元素) - 用
ArrayList.get(i)时误以为和数组一样宽松,其实也会抛同名异常
该捕获还是该预防?
绝大多数情况下,不该用 try-catch 捕获。这个异常本质是程序逻辑缺陷,不是可恢复的外部异常(比如网络超时)。捕获它往往掩盖了真正的问题点,还可能让后续代码在脏数据上继续执行。
正确做法是前置防御:
立即学习“Java免费学习笔记(深入)”;
- 访问前加断言:
if (i >= 0 && i - 用
Optional.ofNullable(array).filter(a -> i >= 0 && i a[i])(适合函数式风格,但别为了炫技增加复杂度) -
工具方法封装:写一个
safeGet(int[] arr, int index, int defaultValue),内部做边界检查并返回默认值 - 单元测试覆盖边界值:
-1、0、array.length - 1、array.length
调试时怎么快速定位具体哪一行出问题?
堆栈里会明确指出出错位置,但有时嵌套深或日志被吞掉。关键看两行:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5
at com.example.MyClass.process(MyClass.java:23)注意两点:
- 错误信息里的
Index 5 out of bounds for length 5表示你试图访问第 6 个元素(索引从 0 开始),但数组长度只有 5 —— 所以合法索引是0~4 - 出错行号
MyClass.java:23是最直接线索,但要小心:如果这一行是方法调用(如helper.doSomething(arr, i)),实际越界可能发生在doSomething内部,得继续往下看堆栈
数组越界本身简单,难的是它背后暴露的控制流疏漏——比如一个本该由 for (int i = 0; i 驱动的逻辑,却在中间某处被手动改成了 i++ 两次,或者并发修改了 list 导致 size 和实际元素数不一致。这类问题不会直接写在异常消息里。










