arrayindexoutofboundsexception是java中因使用负数或≥数组长度的非法索引访问数组而触发的非受检运行时异常,继承自indexoutofboundsexception;预防关键在于访问前校验索引是否满足0 ≤ index
IndexOutOfBoundsException 本质是程序试图用非法索引访问带索引结构(如数组、ArrayList、LinkedList 等)时触发的运行时异常。它不强制捕获,但一旦发生,往往暴露逻辑漏洞。防御式编程的核心不是等它抛出再处理,而是从源头掐断越界可能——重点在“查”和“控”,而非“抓”。
访问前必做边界校验
任何外部输入、计算结果或动态变量作为索引使用前,都必须显式验证其合法性。合法索引范围恒为 0 ≤ index (对集合)或 0 ≤ index (对数组)。
- 不要依赖注释或“应该没问题”的假设,哪怕循环变量看起来可控
- 校验逻辑应紧邻访问语句,避免中间插入修改 size 或 index 的代码
- 示例:获取用户指定位置的元素时,先判断
if (index >= 0 && index ,再调用 <code>list.get(index)循环遍历要严守边界条件
for 循环是最常见的越界温床,错误多源于混淆“小于长度”和“小于等于长度”。
- 遍历数组或 List 时,终止条件必须是
i 或 <code>i ,绝不能写成 <code>- 使用增强 for 循环(
for (Type e : list))可完全规避索引管理,适合纯遍历场景- 若需索引参与运算(如跳过首尾、双指针),务必在每次使用前重检索引有效性,尤其在循环体内修改了集合大小之后
优先选用更安全的替代结构
有些数据结构天生自带边界防护,或提供更健壮的访问方式。
- 用
List.get(int)前,考虑是否可用list.stream().skip(n).findFirst()或list.subList(from, to)(后者本身也会检查边界,但异常信息更明确)- 对固定结构操作,可封装工具方法,例如:
safeGet(list, index, defaultValue),内部完成校验并返回默认值,避免上层重复写 if- 多线程环境下,普通 ArrayList 不保证迭代时 size 稳定,可考虑
Collections.unmodifiableList或并发集合类,减少竞态导致的隐性越界输入与配置必须做可信度过滤
用户输入、配置文件读取、网络响应解析得到的索引,一律视为不可信数据。
- 前端传来的分页参数
page=1&size=20&offset=400,后端不能直接用于list.subList(offset, offset+size),须先校验offset + size- 解析 JSON 数组时,不要假设字段一定存在或长度足够;用
JsonArray.size()获取真实长度后再取值- 日志中记录越界请求的原始参数,便于回溯是数据问题还是逻辑缺陷
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南












