arrayindexoutofboundsexception是运行时异常,防越界需严守循环边界(正向用i=0)、动态索引必校验(if(index>=0&&index

Java 一维数组下标越界异常(ArrayIndexOutOfBoundsException)不是编译错误,而是在运行时由 JVM 主动检查并抛出的 RuntimeException。它只在真正执行 a[i] 这类访问时触发,且消息明确:比如 “Index 5 out of bounds for length 5” 就说明你用了下标 5,但合法范围是 0~4。防住它不靠运气,靠结构化习惯。
严格守住循环边界,别让 i 多走一步
绝大多数越界来自 for 循环条件写错。记住一个铁律:正向遍历必须用 i ,不是 <code>,也不是硬编码数字。
- 错误写法:
for (int i = 0; i → 最后一次 i = arr.length,访问 arr[arr.length] 必崩 - 正确写法:
for (int i = 0; i - 反向遍历起点必须是
arr.length - 1,终止条件是i >= 0,不是i > 0或从arr.length开始 - 配对操作(如比较 arr[i] 和 arr[i+1])时,上限要设为
i ,否则最后一轮 i+1 越界
动态索引必须校验,不能信“应该没问题”
只要下标不是写死的 0、1、2 这种字面量,就属于动态索引——用户输入、split() 结果、取模计算、接口返回值等,全部要先检查再访问。
- 标准校验模板:
if (index >= 0 && index ,负数和超长两个方向都防住 - split() 后先判空:
String[] parts = s.split(","); if (parts.length > 0) { use parts[0]; } - 取模不等于安全:若 i 可能为负,
i % arr.length仍可能为负;应改用(i % arr.length + arr.length) % arr.length - 封装工具方法更清晰,比如
ArrayUtils.checkIndex(int index, int length),复用且语义自明
能绕开索引,就尽量绕开
不需要下标本身时,手动维护 i 就是给自己埋雷。JVM 提供了天然安全的替代方式:
- 只读遍历一律用增强 for 循环:
for (int x : arr),完全消除越界可能 - 需要索引但不想算错:改用
ArrayList,配合list.size()和list.get(i),部分方法自带边界检查 - 复杂逻辑可转流式操作:
IntStream.range(0, arr.length).forEach(i -> {...}),边界由流自身保证 - 别为了用 for-each 硬套,又额外维护一个计数器变量——那反而增加出错概率
null 和空数组必须提前兜底
漏判 null 会抛 NullPointerException,容易误判为越界;空数组长度为 0,直接进循环或访问下标也会崩。二者要一起处理:
- 统一防护写法:
if (arr == null || arr.length == 0),之后才考虑索引逻辑 - 方法入口建议快速失败:
if (arr == null || arr.length == 0) throw new IllegalArgumentException(...) - 若空数组有业务含义(比如表示无数据),应显式分支处理,不要让逻辑穿透到索引访问语句
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











