ArrayIndexOutOfBoundsException 是运行时异常,因访问数组越界索引(如-1、length或更大值)触发;常见于循环边界错误、动态索引计算或未校验外部输入。

ArrayIndexOutOfBoundsException 是什么
它不是你代码写错了,而是运行时访问了数组不存在的索引位置。Java 数组下标从 0 开始,最大合法索引是 array.length - 1。一旦用 -1、array.length 或更大的数去取值,JVM 就会抛出这个异常。
常见触发场景和写法
这类错误往往藏在循环边界、动态计算索引、或外部输入未校验的地方:
- 用
for (int i = 0; i —— 多跑一次,i == array.length时越界 - 用
list.get(i)混淆了List和数组,但实际操作的是array[i] - 从用户输入、JSON 解析或数据库查出索引值后,直接当数组下标用,没检查是否在
[0, array.length)范围内 - 多线程环境下,一个线程刚判断
i ,另一个线程就改了数组长度(比如Arrays.copyOf或重新赋值),导致判断失效
怎么避免而不是 catch 它
捕获 ArrayIndexOutOfBoundsException 是反模式。它属于 RuntimeException,设计上就该在编码阶段消除,而不是靠 try-catch 补救:
- 所有数组访问前,显式检查
index >= 0 && index ,尤其在封装工具方法时 - 用增强 for 循环(
for (Type e : array))代替带索引的普通 for,彻底避开索引计算 - 需要索引逻辑时,优先考虑
java.util.List(如ArrayList),它的get()方法文档明确写了越界行为,且更易配合size()做前置校验 - 调试时在 IDE 中启用「Break on Exception」,勾选
ArrayIndexOutOfBoundsException,能快速定位首次越界点
一个典型修复示例
下面这段代码在 i == arr.length 时必然崩溃:
立即学习“Java免费学习笔记(深入)”;
int[] arr = {1, 2, 3};
for (int i = 0; i <= arr.length; i++) {
System.out.println(arr[i]); // 抛出 ArrayIndexOutOfBoundsException
}修正方式不是加 try-catch,而是收紧循环条件:
int[] arr = {1, 2, 3};
for (int i = 0; i < arr.length; i++) { // 改成 <
System.out.println(arr[i]);
}如果业务确实需要“尝试访问”,应主动判断:
int[] arr = {1, 2, 3};
int idx = getUserInputIndex(); // 可能为 -5 或 10
if (idx >= 0 && idx < arr.length) {
System.out.println(arr[idx]);
} else {
System.out.println("无效索引: " + idx);
}数组越界问题本身简单,难的是在嵌套调用、流式处理(如 Stream.of(arr).skip(n).findFirst())、或 JNI 交互中,索引来源变得隐蔽。真正要盯住的,从来不是异常怎么 catch,而是谁在哪儿生成了那个越界的 int 值。










