必须检查 i >= 0 且 i
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 <p>注意:不要写成 <code>if (i ,虽然数学等价,但当 <code>array.length == 0</code> 时,<code>array.length - 1</code> 是 -1,<code>i 判断可能掩盖 <code>i</code> 本身为负的问题;而 <code>i + 1 在 <code>array.length == 0</code> 时天然为 false,更安全。</code></code></code></p><h3>C# 和 Python 的差异提醒:它们默认不帮你兜底</h3><p>C# 的 <code>array[i]</code> 和 Python 的 <code>list[i]</code> 都会抛异常,但行为细节不同:</p>
- C#:
array[-1]直接抛IndexOutOfRangeException,不支持负索引- Python:
list[-1]是合法的(取末尾),但list[100]或list[-100](超出长度)仍抛IndexError这意味着:跨语言迁移逻辑时,不能假设负索引“自动安全”;也不能依赖某语言的宽容特性去写通用边界逻辑。统一用显式范围检查最可靠。
越界不是边缘情况,而是索引运算中每一步都可能触发的常态风险。最容易被忽略的是「复合索引」——比如
i + offset、i * 2、baseIndex + j,这些地方往往只校验了主变量,却忘了算式结果本身是否越界。











