数组越界异常本质是访问不存在索引,排查需准确定位抛出点并还原索引计算逻辑;重点检查堆栈顶层行的数组访问操作、动态索引及外部输入依赖,执行长度、索引值、来源逻辑三步验证,并防范空集合、循环条件错误、字符串截取越界等常见场景。

数组越界异常(ArrayIndexOutOfBoundsException)本质是访问了不存在的索引位置,排查核心在于**准确定位越界发生点 + 还原索引计算逻辑**。不是盲目加 try-catch,而是要让“谁越界、为什么越界、怎么修”一目了然。
快速定位异常源头
看堆栈最顶层的 at 类名.方法名(文件名:行号),这是实际抛出异常的位置。重点关注该行是否包含:
- 数组访问操作:如
arr[i]、list.get(i)(ArrayList 底层仍是数组)、str.charAt(i) - 循环变量或动态计算的索引:如
i、index + offset、size / 2等表达式 - 边界条件依赖外部输入:比如从用户输入、配置文件、网络响应中读取的索引值
检查索引合法性(三步验证)
在抛出异常的那行代码前,插入临时日志或断点,确认三个关键值:
-
数组长度:用
arr.length(或list.size()、str.length())获取真实容量 - 待访问索引值:打印具体数值,注意它是否为负数、是否 ≥ 长度
-
索引来源逻辑:比如循环中是
i < arr.length还是i <= arr.length;递归调用时是否忘记减 1;截取子串时起始/结束位置是否反了
常见易忽略场景
这些地方看似合理,实则高发越界:
-
空数组/集合未判空:直接访问
arr[0]或list.get(0),应先检查length == 0或isEmpty() -
循环终止条件写错:把
<写成<=,或对非零起点循环(如for (int i = 1; i <= n; i++))误用 1-based 思维操作 0-based 数组 -
字符串操作越界:如
str.substring(5, 10)但字符串只有 7 个字符;或str.charAt(str.length())—— 最大合法索引是length() - 1 -
多线程下 size 变化:先检查
list.size() > i,再执行list.get(i),但中间 list 被其他线程清空或缩小
预防性加固建议
不靠运气,靠设计:
- 所有外部传入的索引参数,入口处做范围校验:
if (idx < 0 || idx >= arr.length) throw new IllegalArgumentException(...) - 用增强 for 循环或迭代器替代手动索引遍历,避免下标管理错误
- 工具类封装安全访问:如
ArrayUtil.get(arr, i, defaultValue),内部处理越界返回默认值 - 单元测试覆盖边界用例:空数组、单元素、索引为 -1 / length / length+1

















