必须检查 i >= 0 且 i < array.length,而非仅 i == 0;尤其在用户输入、i-1 偏移或协议解析时易越界。

Java 中访问 array[i] 前必须检查什么
不是只检查 i 就够了。Java 数组索引合法范围是 <code>[0, array.length),负数和超长都会抛 ArrayIndexOutOfBoundsException。所以每次直接用下标前,两个条件缺一不可:
i >= 0i
漏掉 i >= 0 在处理用户输入、计算偏移(如 i - 1)或解析协议字段时特别危险。例如:if (i —— 若 <code>i 是 -1,照样崩溃。
遍历数组时 for 循环的边界怎么写才不越界
标准写法是 for (int i = 0; i 。关键在 <code> 而不是 <code>,因为最大合法索引是 <code>array.length - 1。
常见错误包括:
- 写成
i :虽等价但易读性差,且当 <code>array为null时先调.length就 NPE 了 - 循环中修改
i或array.length(比如在循环里array = new int[...]):下次判断仍用旧 length,但实际内存已变 - 用增强
for却需要索引:这时别硬套array[i],改用传统循环或封装带索引的迭代逻辑
访问 array[i + 1] 这类相邻元素时怎么防越界
这是高频越界点。不能只检查 i 合法,必须确认 i + 1 也在范围内。正确模式是:
if (i >= 0 && i + 1 < array.length) {
doSomething(array[i], array[i + 1]);
}
注意:不要写成 if (i ,虽然数学等价,但当 <code>array.length == 0 时,array.length - 1 是 -1,i 判断可能掩盖 <code>i 本身为负的问题;而 i + 1 在 <code>array.length == 0 时天然为 false,更安全。
C# 和 Python 的差异提醒:它们默认不帮你兜底
C# 的 array[i] 和 Python 的 list[i] 都会抛异常,但行为细节不同:
- C#:
array[-1]直接抛IndexOutOfRangeException,不支持负索引 - Python:
list[-1]是合法的(取末尾),但list[100]或list[-100](超出长度)仍抛IndexError
这意味着:跨语言迁移逻辑时,不能假设负索引“自动安全”;也不能依赖某语言的宽容特性去写通用边界逻辑。统一用显式范围检查最可靠。
越界不是边缘情况,而是索引运算中每一步都可能触发的常态风险。最容易被忽略的是「复合索引」——比如 i + offset、i * 2、baseIndex + j,这些地方往往只校验了主变量,却忘了算式结果本身是否越界。

















