Java数组长度校验是防御性编程的必备基础,必须在方法入口判空并验证长度,对外部输入尤其需主动拦截null和越界访问,通过Math.min、stream过滤、长度守卫等手段实现源头治理与容错。

Java 数组长度校验不是“可做可不做”的附加项,而是防御性编程中必须落地的基础动作。数组越界(ArrayIndexOutOfBoundsException)和空数组访问(NullPointerException)在生产环境中高频出现,根源往往不是逻辑错误,而是对数组状态缺乏主动判断。
校验数组非 null 且长度合法
任何接收数组参数的方法,第一行就该做两件事:判空 + 判长度。尤其当数组来自外部输入(如 HTTP 请求体、文件解析、RPC 响应)时,绝不能假设它“一定有值、一定够长”。
- 用
Objects.requireNonNull(array, "数组不能为空")拦住 null 引用 - 再用
if (array.length == 0)或if (index >= array.length)显式拦截非法索引 - 避免写
array[0]这类“默认存在首个元素”的危险操作——先确认array.length > 0
遍历前检查 length,避免隐式越界
for 循环里直接用 i 是安全写法;但若手动维护索引(比如 while + 自增),必须在每次访问前重校长度。常见陷阱是:循环中数组被其他线程修改,或方法内部提前 return 导致后续索引失效。
- 坏写法:
int len = array.length; for (int i = 0; i —— 看似安全,但若 <code>array是共享可变对象,len 可能已过期 - 好写法:
for (int i = 0; i —— 每次都读取实时长度 - 更稳妥:对关键业务数组封装成不可变包装类,或使用
List.copyOf(array)防止外部篡改
处理 byte[] 集合时严防 null 元素
当操作 ArrayList<byte></byte> 或 byte[][] 时,NPE 往往发生在 bytes.length 这一行——因为集合里混入了 null 元素。这不是数组本身越界,而是对 null 引用的非法访问。
立即学习“Java免费学习笔记(深入)”;
- 遍历时必须加
if (bytes != null)判断,再访问length - 推荐统一兜底:用
Optional.ofNullable(bytes).map(b -> b.length).orElse(0) - 源头治理:在构建集合时就过滤或替换 null,例如
userBytes.stream().filter(Objects::nonNull).collect(Collectors.toList())
对外部返回数组做长度截断与容错
调用第三方接口、读取硬件寄存器、解析二进制协议时,常遇到“约定长度 20 字节,实际返回 25 字节”的情况。硬编码 new char[20] 并逐字节填充,极易越界崩溃。
- 始终用
Math.min(index, array.length - 1)控制写入位置 - 读取循环中加入长度守卫:
if (index >= MAX_LABEL_SIZE) break; - 日志记录实际长度与预期差异,便于快速定位协议变更或数据异常



















