数组越界异常源于访问非法索引,排查需定位堆栈行号并检查索引逻辑;常见错误包括混淆length与最大下标、循环边界用

数组越界异常(ArrayIndexOutOfBoundsException)是 Java 中最常见运行时异常之一,本质是访问了数组不存在的索引位置——比如对长度为 5 的数组访问下标 5 或 -1。排查关键在于**快速定位出错位置 + 理清索引计算逻辑**。
看堆栈信息,锁定具体行号和数组变量
异常堆栈第一行通常就指明了哪一行代码抛出异常,例如:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3at com.example.MyClass.process(MyClass.java:22)
这说明第 22 行访问了一个长度为 3 的数组,却用了索引 3(合法范围是 0~2)。此时要检查该行是否涉及 arr[i]、arr.length、arr[arr.length] 这类操作,特别注意有没有把 length 当成最大有效下标用。
检查循环边界和索引计算表达式
绝大多数越界发生在循环中,常见错误包括:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 用
替代 <code>:如 <code>for (int i = 0; i → 最后一次 i = arr.length,越界 - 索引偏移错误:如处理字符串时用
str.charAt(i+1)却没限制i - 多维数组混淆维度:如
matrix[i][j]中i超出matrix.length,或j超出matrix[i].length - 手动维护索引变量(如 while 循环中的
index++)未及时判断边界
运行时加日志或调试,验证索引值
在可疑代码前打印关键变量值:
System.out.println("i=" + i + ", arr.length=" + arr.length);System.out.println("arr[" + i + "] = " + arr[i]); // 这行会触发异常,所以放前面
更推荐用 IDE 调试:在报错行打上断点,运行到前一步观察 i、arr.length、循环条件变量的实际值。尤其注意循环结束条件是否被修改过(比如在循环体内改变了 arr 引用或长度)。
防御性编程:提前校验,避免依赖“不会越界”的假设
对不确定来源的索引,显式判断再访问:
- 方法入参含索引时,开头加
if (index = arr.length) throw new IllegalArgumentException(...); - 用增强 for 循环替代传统下标循环,避开索引管理(但失去下标信息)
- 使用
List替代原始数组,配合get(index)(仍会抛异常,但语义更清晰),或用Optional.ofNullable(list.get(index))包装 - 工具类如 Apache Commons Lang 的
ArrayUtils.get(array, index, defaultValue)提供安全取值
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










