数组越界异常暴露的是逻辑错误,须在访问前拦截:通过堆栈定位出错行和索引值,检查循环边界(如i < arr.length)、链式调用源头、动态索引校验(index >= 0 && index < arr.length),优先使用增强for或Stream避免手动索引。

数组越界异常不能靠 try-catch 捕获来解决,它暴露的是逻辑错误,不是意外情况。真正有效的做法是让越界访问在发生前就被拦住。
看堆栈,准确定位哪一行、哪个索引出问题
异常信息里会明确写出越界值和数组长度,例如 Index 5 out of bounds for length 5,说明试图访问索引 5,但数组合法范围是 0~4。关键动作是:
- 直接跳转到堆栈最上面的
at 类名.方法名(文件名:行号)那一行 - 检查该行是否写了
arr[i]、arr[arr.length]或arr[常量]这类明显越界的写法 - 若涉及链式调用(如
list.get(i).toString()),要确认是get(i)越界,还是后续方法因 null 报错——堆栈指向的是最终抛异常的位置
盯紧循环边界和索引计算逻辑
绝大多数越界发生在循环中,常见错误有固定模式:
- for 循环条件写成
i <= arr.length,应改为i < arr.length - 反向遍历起点设为
i = arr.length,应改为i = arr.length - 1 - 需要比较相邻元素(如
arr[i] 和 arr[i+1])时,循环上限必须是arr.length - 1 - 字符串操作中用
str.charAt(i + 1)却没限制i < str.length() - 1
访问前强制校验,别信“不会越界”的假设
任何可能作为索引的值——不管是用户输入、配置读取、计算结果还是循环变量——只要用于 arr[i],就得先过两关:
立即学习“Java免费学习笔记(深入)”;
- 检查是否为负:
index < 0 - 检查是否超长:
index >= arr.length - 推荐写法:
if (index >= 0 && index < arr.length) { ... } - Java 9+ 可用标准工具:
Objects.checkIndex(index, arr.length),异常提示更清晰
能绕开索引,就尽量不碰索引
不需要下标信息时,手动管理索引纯属给自己加风险:
- 只读遍历一律用增强 for:
for (int x : arr),JVM 自动控制,零越界可能 - 需处理流式数据,优先用
Arrays.stream(arr)或Stream.of(arr) - 字符串遍历改用
for (char c : str.toCharArray()),避开charAt(i) - 外部传入索引(如分页 offset)必须视为不可信,校验必须包含
< 0和>= size两种情况


















