ArrayIndexOutOfBoundsException是运行时异常,非编译错误;合法索引为0到length-1;需预防越界(如修正for循环条件i<array.length)并优雅处理。

Java数组下标越界异常(ArrayIndexOutOfBoundsException)不是编译错误,而是在运行时由JVM自动检测并抛出的典型运行时异常。它不强制要求捕获,但一旦发生且未处理,程序会立即中断。实战中关键不在“怎么兜住异常”,而在于“怎么提前防住”和“必要时怎么优雅应对”。
明确合法索引范围:0 到 length - 1
这是所有预防动作的基础。Java数组索引严格从 0 开始,最大有效下标是 array.length - 1。任何小于 0 或大于等于 array.length 的值都非法。
- 常见错误写法:
for (int i = 0; i —— <code>i 多走一轮,最后访问 <code>array[array.length]必然越界 - 正确写法:
for (int i = 0; i 或更安全的 <code>for (int i = 0; i (始终用 <code>.length,不硬编码数字) - 负数索引如
arr[-1]同样触发异常,哪怕逻辑上想“取最后一个”,也不能靠负数下标(Java不支持)
主动边界检查比捕获异常更高效
在索引来自用户输入、配置、计算结果或外部接口时,优先做显式校验,而不是依赖 try-catch。异常机制开销大,且掩盖了本可避免的逻辑缺陷。
- 示例:访问前判断
if (index >= 0 && index < array.length) {<br> return array[index];<br>} else {<br> throw new IllegalArgumentException("Invalid index: " + index);<br>} - 对集合操作也适用:调用
subList(start, end)前,确保0 ≤ start ≤ end ≤ list.size() - 工具方法封装:可提取通用校验工具,如
ArrayUtils.checkIndex(int index, int length),复用且语义清晰
用 for-each 或增强型循环规避手动索引
当只需遍历全部元素、无需索引本身时,for-each 循环完全消除越界风险,代码更简洁、意图更明确。
立即学习“Java免费学习笔记(深入)”;
- 替代传统 for:
for (int value : array) {<br> System.out.println(value);<br>} - 注意限制:无法获取当前索引,也无法反向遍历或跳过元素;若需索引,改用传统 for 并严守
i - 对 List 同样适用:
for (String s : stringList)安全且推荐
必要时才用 try-catch,且要有明确目的
try-catch 不该是兜底习惯,而应服务于具体业务场景,比如容错日志、降级响应或用户友好提示。
- 不推荐:
try { result = arr[i]; } catch (ArrayIndexOutOfBoundsException e) { /* 忽略或空处理 */ }—— 掩盖问题,难以调试 - 合理用法:
• 解析用户上传的不规范数据时,捕获后记录警告日志并跳过该条
• 提供默认值:int val = (i >= 0 && i 比异常更轻量<br>• 在测试或脚手架代码中临时观察越界位置(仅限开发阶段)


















