核心是确保索引始终在0到array.length-1范围内,正向循环用i<arr.length,反向用i>=0,配对访问上限为i<arr.length-1,动态索引必先校验,空数组和null须提前检查。

核心是让索引始终落在 0 到 array.length - 1 这个闭区间内,不依赖经验记忆,而是靠结构设计和流程约束来堵住漏洞。
严格匹配合法索引边界
一维数组没有例外:起始必须是 0,终止条件必须是 i < array.length(不是 <=,也不是 ==)。反向遍历时,起始是 array.length - 1,终止条件是 i >= 0。任何偏离这个区间的写法,比如 i <= array.length - 1 或 i < array.length + 1,都埋着越界风险。
- 正向循环标准写法:
for (int i = 0; i < arr.length; i++) - 反向循环标准写法:
for (int i = arr.length - 1; i >= 0; i--) - 配对访问(如比较
arr[i]和arr[i+1])时,上限应设为i < arr.length - 1
动态索引必须先校验再使用
所有非字面量下标——包括用户输入、计算结果、字符串 split() 后取值、取模偏移、除法截断等——都不能跳过合法性检查。只用一次判断: if (index >= 0 && index < arr.length),缺一不可。
-
split()后的数组极易为空:String[] parts = s.split(",");若s为空或全为分隔符,parts.length == 0,直接访问parts[0]必崩,须先判空再判长度 - 取模不等于安全:若
i可能为负,i % arr.length仍可能为负;应改用(i % arr.length + arr.length) % arr.length或先做非负归一
优先绕开手动索引管理
不需要显式下标时,彻底放弃索引是最省心、零成本的防御方式。
- 只读遍历一律用增强 for 循环:
for (int x : arr),JVM 自动控制范围,无越界风险 - 需要索引但想降低出错率:改用
ArrayList配合size()检查,语义更清晰;或转为 Stream 操作,如IntStream.range(0, list.size()).forEach(i -> {...}) - 避免在循环中混用多种索引逻辑(如外层用
i,内层用i+2),容易漏算边界
空数组与 null 值提前兜底
数组未初始化或长度为 0 是高频越界诱因,应在访问前完成基础状态确认。
- 先判
array != null,再判array.length > 0,两者缺一不可 - 函数参数传入的数组,建议在方法入口加快速失败检查:
if (arr == null || arr.length == 0) throw new IllegalArgumentException("Array must be non-null and non-empty"); - 对空数组有业务含义的场景,应显式分支处理,而不是让逻辑穿透到索引访问语句

















