IndexOutOfBoundsException 明确提示代码逻辑存在边界错误,应优先预防、谨慎捕获、杜绝掩盖问题;合法索引范围为0到size()-1,需严格校验动态索引并避免循环条件错误。

Java 中的 IndexOutOfBoundsException(包括其子类 ArrayIndexOutOfBoundsException 和 StringIndexOutOfBoundsException)不是该“捕获后吞掉就完事”的异常,而是明确提示**代码逻辑存在边界错误**。处理它的核心思路是:优先预防,谨慎捕获,杜绝掩盖问题。
明确合法索引范围
所有基于索引访问的数据结构,有效下标都是 0 到 size() - 1(闭区间),即索引必须同时满足:
- index ≥ 0
- index (数组)或 index (List)或 index (String)
例如:int[] arr = {10, 20};,合法索引只有 0 和 1;访问 arr[2] 或 arr[-1] 都会抛出异常。
避免在访问前写错循环条件
这是最常见、最隐蔽的越界源头。错误写法往往把 写成 <code>,或混淆了 <code>length 和 length - 1:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- ❌ 错误:
for (int i = 0; i (多执行一次) - ✅ 正确:
for (int i = 0; i - ✅ 更安全写法(避免重复计算):
int len = arr.length; for (int i = 0; i
动态索引务必先校验再使用
当索引来自用户输入、配置、计算结果或外部接口时,绝不能假设它“大概率合法”:
- ❌ 危险:
int idx = parseUserInput(); String s = list.get(idx); - ✅ 推荐:
if (idx >= 0 && idx - ? 提示:对空集合/字符串要单独检查,比如
if (str.isEmpty()) return;,再访问str.charAt(0),否则空串直接触发StringIndexOutOfBoundsException。
不建议用 try-catch 捕获来“兜底”
虽然语法上可以 try { arr[i] } catch (ArrayIndexOutOfBoundsException e) { ... },但这是反模式:
- 掩盖真实逻辑缺陷,让 bug 潜伏更久
- 异常创建开销远高于一次 if 判断
- JVM 边界检查本身极快,异常只应在真正“意外且不可预知”的场景下使用(而数组越界几乎总是可预知的)
- 若确实需要容错(如解析不规范日志),也应记录日志并明确降级策略,而非静默忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










