防范数组索引越界需从源头校验动态索引:所有非字面量下标(含用户输入、运算结果等)必须显式验证0≤index<length,禁用“应该不会超”假设,统一用index>=0&&index<length。

防范数组索引计算越界,关键不是等异常发生再捕获,而是从索引生成源头就切断越界可能。所有动态算出来的下标——无论是用户输入、数学运算、字符串分割结果,还是嵌套逻辑推导——都必须经过显式边界验证,不能依赖“应该不会超”这类假设。
动态索引必须先校验再访问
任何非字面量的索引值,哪怕只经过一次加减或取模,都要立刻检查合法性:
- 写法要统一:始终用 index >= 0 && index ,缺一不可(负数和超长都要防)
- split() 后的数组极易出问题:String[] parts = s.split(","); 如果 s 是空串或全逗号,parts.length 可能为 0,parts[0] 必崩
- 取模运算不等于安全:arr[i % arr.length] 看似兜底,但若 i 是负数,i % arr.length 可能为负——得用 (i % arr.length + arr.length) % arr.length 或先做非负处理
- 除法偏移也要防:arr[i / 2] 在 i 很大时可能远超 length,尤其当 i 来自外部或累计变量时
循环边界必须严格匹配 length
for 循环是最常翻车的场景,错误往往藏在符号和起始点里:
- 正向遍历:条件必须是 i ,不是
- 反向遍历:起点必须是 array.length - 1,不是 array.length
- 配对操作(如比较 arr[i] 和 arr[i+1]):上限得设成 array.length - 1,否则最后一轮 i+1 必越界
- 嵌套循环中,内层上限若含外层变量(如 for(int j = i; j
优先绕开索引,用更安全的遍历方式
不需要下标时,就彻底放弃索引管理,这是零成本防御:
- 只读遍历一律用增强 for 循环:for (int x : arr),JVM 自动控制范围,无越界风险
- 需要索引又想省心?改用 List:ArrayList 的 get(i) 虽也会抛异常,但配合 size() 检查语义更清晰;且可考虑用 stream 或 forEach 避免手动索引
- 字符串处理少用 charAt(i),多用 for (char c : str.toCharArray()) 或 str.chars().forEach()
空数组和 null 引用必须同步检查
越界异常常和空指针混淆,二者要一起防:
- 数组引用本身可能是 null,此时访问 arr[i] 抛的是 NullPointerException,不是 ArrayIndexOutOfBoundsException
- 校验顺序建议:先判 null,再判 length,最后校验索引 —— if (arr == null || index = arr.length)
- 工具方法可封装复用:public static
T safeGet(T[] arr, int index, T defaultValue) { return (arr != null && index >= 0 && index

















