集合非空校验需作为接口契约和流程守门人,统一用工具类封装(如CollectionUtils.isNotEmpty)、注解约束(@NonNull、@NotEmpty)、DTO强制初始化、工厂/构建器兜底及DAO层返回emptyList(),杜绝null集合进入业务逻辑。

集合前置非空校验不是加一层 if 判断那么简单,而是要把“非空”变成接口契约和流程守门人,让空集合根本走不到业务逻辑里。
统一用工具类封装判空逻辑
手写 collection != null && !collection.isEmpty() 容易漏、难复用、语义弱。换成 Apache Commons 或 Spring 的工具方法,既简洁又自带语义:
-
CollectionUtils.isNotEmpty(collection)—— 一行代替两行,且内部已做 null 安全处理 -
Assert.notEmpty(collection, "用户列表不能为空")(Spring Assert)—— 校验失败直接抛带提示的 IllegalArgumentException,不进业务分支 - 自定义静态工具如
Check.requireNonEmpty(list, "订单项"),便于团队统一风格和扩展日志埋点
在接口契约中声明集合必非空
别等调用方传个 null 集合进来才处理。从方法签名就定规矩:
- 服务接口方法参数标注
@NonNull List<Order> orders,配合 Lombok 或 IDE 提示,编码阶段就预警 - DTO 接收层用构造器或 Builder 强制初始化集合字段:
private final List<Item> items = new ArrayList<>();,杜绝字段为 null - 返回值若约定“总有数据”,就别返回
List<T>,改用ImmutableList<T>或包装类(如Result<List<T>>),天然不可空
在 Web 入口统一拦截空集合参数
前端可能传空 JSON 数组 [],也可能传 null 字段。Filter 或 ControllerAdvice 可提前截住:
- 对请求体反序列化后的 DTO,遍历其集合字段,用
Objects.requireNonNull或自定义校验器检查是否为 null - 对 URL 查询参数(如
?ids=1,2,3),解析成 List 后立即判空,if (ids == null || ids.isEmpty()) throw new BadRequestException("ids 不能为空") - 结合 Spring Validation,用
@NotEmpty注解 +@Valid触发全局校验,失败自动返回 400
工厂/构建器确保集合对象合法创建
避免裸 new 出来一个 null 集合再传给下游。把创建逻辑收口:
- 定义
OrderListFactory接口,createFromRequest(List<Item> rawItems)方法内部强制:若 rawItems 为 null,转为空列表;若含 null 元素,过滤或抛异常 - Builder 模式中,在
build()前校验:if (this.items == null) this.items = new ArrayList<>(); - DAO 层查询结果统一兜底:即使数据库没查到,也返回
Collections.emptyList(),而不是 null

















