Java怎么防范数组越界IndexOutOfBoundsException实战

作者:袖梨 2026-06-19
防范IndexOutOfBoundsException的关键是访问前显式校验索引合法性:数组和List需检查0≤index<size,字符串需检查0≤index<length,任何可能作索引的值都必须拦截越界。

防范 indexoutofboundsexception 的关键,不是等它抛出来再补救,而是让越界根本没机会发生。重点在访问前拦截非法索引,而不是靠 try-catch 去兜底。

访问前必须做显式边界校验

任何可能成为索引的值——无论是用户输入、配置读取、计算结果,还是循环变量——只要用于 array[i]list.get(i)str.charAt(i),都得先验证合法性。

  • 数组:检查 index >= 0 && index
  • List:检查 index >= 0 && index
  • 字符串:检查 index >= 0 && index

校验代码要紧贴访问语句,中间不能插入可能改变 size 或 index 的逻辑。比如从请求里拿到 offset 和 size 做分页时,不能只校验 offset,还得确保 offset + size 。

循环遍历别踩边界坑

for 循环是最容易写错的地方。常见错误是把终止条件写成 i 或 <code>i ,多走一轮就必然越界。

  • 标准写法永远是:for (int i = 0; i
  • 不需要索引时,直接用增强 for:for (String s : list),彻底避开索引管理
  • 需要索引参与运算(比如跳过首尾、双指针),每次用到索引前都要重检,尤其在循环中修改了集合大小之后

用更安全的替代方式封装风险

把越界检查逻辑下沉,上层调用就能更干净、更可靠。

立即学习“Java免费学习笔记(深入)”;

  • 封装工具方法,如 safeGet(List<T> list, int index, T defaultValue),内部完成校验并返回默认值
  • list.subList(from, to) 替代手动截取,它本身会校验边界,且异常信息更明确
  • 对 JSON 数组操作,先调 jsonArray.size() 获取真实长度,再取值;不假设字段一定存在或长度足够

外部输入一律视为不可信

前端传来的分页参数、配置文件里的索引配置、网络响应中的数组下标——这些都不是“应该没问题”,而是“默认有问题”,必须强制过滤。

  • 日志中记录越界请求的原始参数(如 offset=999, size=20),方便区分是数据问题还是逻辑缺陷
  • 多线程环境下,普通 ArrayList 迭代时 size 可能被其他线程修改,考虑用 Collections.unmodifiableList 或并发集合类
  • 避免注释代替校验,比如写“// i 由 for 循环保证合法”——循环逻辑一旦被重构,注释就失效了

相关文章

精彩推荐