数组长度校验必须前置,应在访问array[index]前完成,而非事后捕获arrayindexoutofboundsexception;错误写法是先取值再判断,正确做法是在方法入口、参数流转和集合操作关键节点嵌入边界检查。

Java 数组长度校验不是“要不要做”的问题,而是“怎么做得准、做得早、做得稳”的问题。核心在于把边界检查嵌入到方法入口、参数流转和集合操作的关键节点,而不是等越界发生后再去捕获异常。
数组长度校验必须前置在访问之前
越界异常(ArrayIndexOutOfBoundsException)是运行时异常,无法编译期拦截,一旦触发就已造成执行中断。因此校验动作绝不能放在 array[index] 之后,也不能依赖 try-catch 去兜底。
- 错误写法:先取值再判断——
if (arr[i] > 0 && i ,此时 <code>i越界会直接抛异常 - 正确顺序:先判范围再取值——
if (i >= 0 && i - 对空数组也要单独处理:
if (arr == null || arr.length == 0),避免arr.length报 NullPointerException
用标准工具类替代手写边界判断
Java 9+ 提供了语义清晰、线程安全的边界检查工具,比手动写 i >= 0 && i 更可靠,也更易读。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
Objects.checkIndex(int index, int length):校验单个索引是否合法 -
Objects.checkFromIndexSize(int fromIndex, int size, int length):校验一段连续范围(如subArray(from, len))是否越界 - 这些方法在非法时抛出 IndexOutOfBoundsException(语义比 ArrayIndexOutOfBoundsException 更通用),且已通过 JVM 层优化,性能损耗可忽略
结合注解与框架实现声明式校验
在 Spring Boot 等现代后端框架中,数组/集合类参数常以请求体(@RequestBody)或嵌套对象形式传入,此时应优先使用 Bean Validation 规范进行声明式校验。
- 对数组字段加
@NotEmpty+@Size(min = 1, max = 100),自动拦截空或超长输入 - 对索引参数(如分页中的
page、size)用@Min(0) @Max(1000)控制合法范围 - 配合全局异常处理器(
@ControllerAdvice),将校验失败统一转为 400 Bad Request 并返回结构化提示,不暴露堆栈
测试必须覆盖边界值场景
校验逻辑是否真正生效,不能只靠“看起来没问题”,而要靠用例验证。重点覆盖以下三类输入:
- 临界值:
index = 0、index = arr.length - 1(合法边界) - 越界值:
index = -1、index = arr.length、index = arr.length + 1(必须拦截) - 极端情况:空数组(
new String[0])、null 数组、长度为Integer.MAX_VALUE的超大数组(注意溢出风险)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










