数组越界异常本质是访问索引超出0到length−1范围,运行时爆发但可预防;排查需依堆栈定位非法索引、数组长度及触发行号,检查硬编码、变量来源及循环条件。

Java 中数组越界异常(ArrayIndexOutOfBoundsException)本质是访问了 0 到 length−1 之外的索引,它不编译报错、只在运行时爆发,但多数情况其实可预防。快速排查不是靠堆栈猜,而是按线索分层定位;解决也不只是加 try-catch,关键是把边界检查落到关键路径上。
看堆栈,先锁定出问题的那行和索引值
异常信息里明确写着 Index 5 out of bounds for length 3 这类提示——它已经告诉你三件事:非法索引是多少、数组实际多长、甚至哪一行代码触发。别跳过这行日志,直接打开对应文件和行号。
- 检查该行是否用了硬编码数字(如
arr[5]),确认数组长度是否真够 - 如果索引是变量(如
arr[i]),往上追溯它的来源:是循环变量?用户输入?计算结果? - 特别注意负数索引(
arr[-1])也属于越界,Java 不支持 Python 那种负向索引
查循环条件,90% 的越界出在这里
最常见的错误是把 i 写成 <code>i 的反面,导致多跑一轮。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 传统 for 循环务必用
i ,而不是 <code>i 或更危险的 <code> - 涉及多个数组嵌套操作(比如双层 for 处理矩阵),每一维都要单独校验:
if (i - 若循环里修改了数组(如清空、重赋值),还要警惕“检查完就失效”的竞态问题——多线程场景下尤其明显
验输入与计算,别让外部数据带偏逻辑
索引来自用户输入、配置文件、接口返回或算法中间结果时,不能默认它合法。
- 对所有外部传入的索引做显式判断:
if (idx >= 0 && idx ,失败时抛 <code>IllegalArgumentException比让 JVM 抛ArrayIndexOutOfBoundsException更语义清晰 - 动态计算索引(如
arr[pos + offset])时,要同步验证pos + offset是否仍在范围内,不能只验pos - 框架返回的数组(如 MyBatis 查询结果为
new String[0])可能为空,访问前必须判空再判长度
换写法,从源头避开手动索引
如果业务只要遍历、不关心下标,就彻底绕开索引风险。
- 优先用增强 for 循环:
for (int val : arr) { ... },零越界风险,代码更直白 - 集合操作同理:
for (String s : list)安全且推荐;需下标时再切回传统 for,并严守边界 - 工具类封装通用校验,比如
ArrayUtils.get(arr, index, defaultValue),复用+降噪
不复杂但容易忽略:越界异常背后往往不是语法错,而是逻辑盲区。盯住索引来源、守住每次访问前的校验、善用更安全的遍历方式,比事后 catch 要高效得多。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










