ArrayList的null与isEmpty校验最佳实践及业务场景问题处理
ArrayList空校验最佳实践
核心校验逻辑实现
避免空指针异常的核心原则是:先判断null,再判断isEmpty,利用Java逻辑与(&&)的短路特性,只要前半段判断为null,后半段的isEmpty方法就不会执行,自然不会抛出空指针。
可以先封装一个通用的列表非空判断工具方法,避免重复写校验逻辑:
// 通用校验方法:列表不为null且包含至少一个元素时返回true public static <T> boolean isNotEmpty(List<T> list) { return list != null && !list.isEmpty(); }
如果项目已经引入了常用工具包,可以直接用现成的API:
- Apache Commons Collections:
CollectionUtils.isNotEmpty(list) - Spring Core:
!CollectionUtils.isEmpty(list)
业务场景代码改造
用上面封装的isNotEmpty方法调整分支逻辑即可覆盖所有边界场景:
List<Result> resultList = new ArrayList<>(); if (isNotEmpty(listA) && isNotEmpty(listB)) { // 两个列表都有值,调用两次存储过程合并结果 resultList.addAll(queryByListA(listA)); resultList.addAll(queryByListB(listB)); } else if (isNotEmpty(listA)) { // 只有listA有值 resultList.addAll(queryByListA(listA)); } else if (isNotEmpty(listB)) { // 只有listB有值 resultList.addAll(queryByListB(listB)); } // 两个列表都为空的场景可按需添加默认处理逻辑
上述逻辑可以覆盖所有输入场景:
- 列表为null时返回false,不会走入对应分支
- 列表为空列表
[]时返回false,不会走入对应分支 - 只有列表确实包含元素时才会执行对应查询逻辑
额外最佳实践建议
- 入参前置处理:如果是外部传入的列表参数,可以在接收时就默认初始化为空列表
List<String> listA = Objects.requireNonNullElse(originList, Collections.emptyList());,后续所有逻辑不需要再判断null,仅需判断isEmpty即可,大幅简化代码 - 避免反向判断踩坑:不要写
list.isEmpty() || list == null这种顺序的判断,会直接触发空指针异常 - 优先用成熟框架的工具类实现,不需要自行重复造轮子,成熟工具类的边界场景处理更完善
内容的提问来源于stack exchange,提问作者user7599667
相关产品推荐
相关产品推荐

