空集合不是异常,应返回空但合法的集合实例(如collections.emptylist()),而非抛出异常或返回null;api响应应通过result结构体表达状态,真正异常才用http 4xx/5xx。

空集合不是异常,不该用异常机制处理——这是优雅处理的核心前提。Java 中返回空集合(如 new ArrayList() 或 Collections.emptyList())是标准实践,抛出 NullPointerException 或自定义异常反而破坏契约、增加调用方负担。
用不可变空集合代替 null
避免返回 null,统一返回空但合法的集合实例:
- 优先用
Collections.emptyList()、Collections.emptySet()、Collections.emptyMap()—— 它们开销极小、线程安全、不可修改 - 若需可变集合,明确新建(如
new ArrayList()),但要确保语义清晰:「查无结果」不等于「出错了」 - 在方法注释中写明:「返回空列表表示未匹配到数据,不会返回 null」
用 Optional 包装「可能无结果」的查询逻辑
当业务语义上「没有集合」本身是一种有意义的状态(比如「用户从未创建过订单」和「查询失败」需区分),可用 Optional<list>></list>:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
Optional.ofNullable(list).filter(l -> !l.isEmpty())可将空集合转为 empty,但慎用——多数场景仍推荐直接返回空集合 - 仅在调用方确实需要区分「没数据」和「没查到」时使用;否则增加冗余判空(
opt.isPresent() && !opt.get().isEmpty()) - 注意:不要对集合元素用
Optional<t></t>包装,那是反模式
统一网关层或 Service 层的响应封装
面向前端或外部系统的 API,应通过响应体结构表达状态,而非靠异常或空集合传递语义:
- 定义通用响应类如
Result<list>> </list>,其中code=200, data=[]表示成功且无数据 - 真正异常(如 DB 连接失败、参数校验不通过)才走 HTTP 状态码 4xx/5xx + 异常处理器(
@ControllerAdvice) - 避免在 service 方法里 throw RuntimeException 来“表示没查到”,这会让调用链失去控制流清晰性
Stream 操作天然兼容空集合
使用 stream() 处理集合时,空集合会自然产生空流,无需额外判空:
-
list.stream().map(...).filter(...).collect(Collectors.toList())对空集合完全安全 - 想提供默认值?用
list.isEmpty() ? defaultList : list比 try-catch 更直白;或用list.stream().findAny().orElseGet(() -> ...) - 切忌为了“统一”而在每个方法开头加
if (list == null) throw new XxxException()—— 这是防御性编程的误用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










