Java数组越界必然发生,预防需在声明初始化、遍历逻辑、索引计算、结构升级四阶段落实边界检查:空/null校验、length绑定循环、负模修正、优先选用ArrayList等安全集合。

Java数组越界不是“会不会发生”的问题,而是“什么时候发生”的问题——只要索引未经校验、循环边界写错、外部输入直通访问,它就一定会出现。预防的核心,是把边界检查变成代码里不可绕过的步骤,而不是靠运气或事后补救。
声明和初始化阶段就要设防
空数组和null数组是越界高发起点。声明时若长度为0(new int[0])或未初始化(int[] arr = null),后续任何带索引的操作都会立刻崩溃或间接引发异常。
- 创建前确认业务逻辑是否允许空数据;不允许的场景,直接在方法入口抛出
IllegalArgumentException - 初始化后立即校验:
if (arr == null || arr.length == 0) { /* 拒绝后续处理 */ } - 避免用魔法数字初始化,如
new String[100]——应根据真实数据规模动态计算长度,或改用ArrayList自动扩容
遍历逻辑必须匹配真实长度
for循环的终止条件不是“习惯怎么写”,而是严格绑定array.length。写成i 或<code>i 这类硬编码,等于主动埋雷。
- 正向遍历唯一安全写法:
for (int i = 0; i - 反向遍历起始必须是
arr.length - 1,终止条件是i >= 0,不是i > 0 - 需要访问相邻元素(如比较
arr[i]和arr[i+1])时,循环上限应为i - 纯读取场景一律用增强for:
for (int x : arr)——它不暴露索引,天然免疫越界
所有动态索引都必须显式校验
用户输入、配置读取、字符串分割结果、取模运算值……只要不是0、1、i++这种确定在循环内可控的值,都默认不可信。
立即学习“Java免费学习笔记(深入)”;
- 校验模板统一为:
if (index >= 0 && index ,两个条件缺一不可 - split()后务必先判空再取值:
String[] parts = s.split(","); if (parts.length > 0) { use(parts[0]); } - 负数取模要修正:
int safeIndex = ((i % arr.length) + arr.length) % arr.length - 校验代码必须紧贴访问语句,中间不能插入可能改变
arr.length或index的逻辑
用结构升级替代缝缝补补
原生数组适合底层、性能敏感或协议交互场景;日常业务中,多数越界问题源于它缺乏容量自适应和安全API。换结构不是妥协,是降本增效。
- 需要增删或不确定长度 → 改用
ArrayList,配合list.size()和list.subList(from, to)(自带边界检查) - 需返回默认值或空安全 → 封装
safeGet(List<T> list, int index, T def),内部完成校验 - 多线程环境迭代 → 避免直接用
ArrayList,改用Collections.unmodifiableList或CopyOnWriteArrayList - 处理JSON数组 → 先调
jsonArray.size(),再用jsonArray.optInt(i)等容错方法,不假设下标存在


















