防范一维数组下标越界需前置校验、简化索引管理、固化安全习惯:循环用i

防范一维数组下标越界,关键不是“出错后再补救”,而是把校验动作前置、把索引管理简化、把常见错误模式固化为习惯。越界异常(ArrayIndexOutOfBoundsException)几乎全因一次未经验证的 arr[i] 访问触发,而它背后往往只是几个重复出现的疏漏。
循环边界必须严格用 i
这是最常踩的坑,尤其在初学阶段或赶工时容易写成 i 或 <code>i 。Java 数组合法索引是闭开区间 <code>[0, arr.length),最大有效下标永远是 arr.length - 1。
- 正向遍历:写
for (int i = 0; i ,别碰 <code> - 反向遍历:起点必须是
arr.length - 1,不是arr.length - 配对操作(如比较
arr[i]和arr[i+1]):循环上限设为arr.length - 1,否则最后一轮i+1必越界
所有外部/动态来源的索引必须显式校验
用户输入、计算结果、字符串 split()、接口返回值……这些索引从不“可信”。不能依赖注释、经验或“应该没问题”,必须每次访问前判断。
- 标准检查写法:
if (index >= 0 && index -
split()后务必先判空:String[] parts = s.split(","); if (parts.length > 0) { use parts[0]; } - 取模、除法、偏移类表达式(如
arr[i / 2]、arr[i - 1])要单独验:除零、负数、超长结果都可能让最终索引失效
能不用索引,就彻底绕开索引
不需要下标本身时,硬写 for (int i = 0; ...) 纯属自找风险。JVM 提供了更安全、更简洁的替代方案。
- 只读遍历:无条件使用增强 for 循环 ——
for (int x : arr),零索引管理,零越界可能 - 需要索引但想省心:改用
ArrayList,配合list.size()和list.get(i),语义清晰且部分方法自带检查 - 空数组和
null引用必须一起防:if (arr != null && index >= 0 && index ,漏掉 <code>null会抛NullPointerException,容易误判为越界
封装通用安全访问方法,避免重复手写判断
频繁校验容易遗漏或写错。把逻辑收拢成工具方法,既统一又可靠。
- 例如泛型工具方法:
public static <t> Optional<t> safeGet(T[] arr, int index)</t></t> - 内部完成
null判断 + 范围检查 + 返回Optional,调用方只需safeGet(arr, i).orElse(null) - 团队内复用后,所有数组访问点都自动带上防护层,无需每处再写 if











