必须校验长度,因为直接访问array[index]不检查索引合法性会导致arrayindexoutofboundsexception等运行时崩溃;核心原则是用短路与&&将边界检查(如index >= 0 && index
为什么数组访问前必须校验长度
直接写
array[index]而不检查index是否在合法范围内,是运行时崩溃的常见源头。尤其当index来自用户输入、网络响应或循环变量时,ArrayIndexOutOfBoundsException(Java)、段错误(C)或IndexError(Python)几乎必然发生。短路与&&不是“锦上添花”,而是把越界访问拦在执行前的最轻量级守门人。用
&&把边界检查放在左边核心原则:把“能快速判定整个表达式为假”的条件放左边,让右边的危险操作(如
array[index])有机会被跳过。
index >= 0 && index —— 安全:任一条件为 <code>false,后续都不执行index —— 仍不安全:若 <code>index是负数,array[index]仍会触发越界(Java/C)或下标错误(Python)- 在 C 中必须同时检查上下界:
index >= 0 && index ;Java 数组只有上界,但负索引同样非法,所以仍需 <code>index >= 0不同语言中容易忽略的细节
看似一致的写法,在不同语言里行为可能微妙不同:
- Java:
array是对象引用,array == null检查必须前置——array != null && index >= 0 && index- C:
size必须是显式传入或计算出的值(sizeof(array)/sizeof(array[0])仅对栈数组有效),不能依赖运行时反射- JavaScript:
array[index]访问越界返回undefined而非报错,但逻辑仍可能错(比如undefined === 5为false),所以校验仍是必要习惯- Python:
and同样短路,但更常用if index in range(len(array)):或异常捕获;不过0 配合 <code>and也完全可行别让副作用藏在右操作数里
如果右边有状态变更、日志、计数器自增等逻辑,
&&会让它不可预测地“消失”:真实场景里,越界不是“会不会发生”的问题,而是“什么时候发生”。用
- ❌
isValid() && counter++ > 0——counter可能完全不增加- ✅ 拆成两步:
boolean valid = isValid(); if (valid) counter++; if (valid && someOtherCheck()) { ... }- 调试时注意:IDE 断点打在
array[index]上,可能永远不触发——这不是 bug,是短路生效了&&做长度校验,成本几乎为零,却能挡住一大类低级但致命的错误。最容易被忽略的,其实是把负索引检查当成可选项——它和上界检查一样,缺一不可。











