orelsethrow用于optional为空时抛出自定义异常,适用于“本应有值却为空”的场景,如查无用户、配置缺失等;需传supplier异常供应者或无参构造引用,相比get()和orelse()更安全可控。

orElseThrow 是 Java 8 引入的 Optional 类中的一个方法,用于在 Optional 为空(即 isPresent() == false)时,主动抛出你指定的异常,避免后续出现 NullPointerException 或逻辑错误。
什么时候该用 orElseThrow
当你明确知道某个 Optional **本应有值**,但因上游逻辑、数据缺失或校验失败导致为空时,就应该用 orElseThrow 快速失败,而不是用 orElse(null) 或 get() 硬扛——后者容易把空指针延迟到更深层才暴露,难定位。
- 查找用户 ID 对应的实体,但数据库没查到 → 不该静默返回 null,而应抛出
UserNotFoundException - 解析配置项,某必填字段未配置 → 抛出
ConfigurationException - 调用第三方服务返回 Optional,空表示协议异常 → 抛出自定义运行时异常
基本用法:传入异常供应商
orElseThrow 接收一个 Supplier<x></x>,只在 Optional 为空时才调用它来创建并抛出异常。这样可避免无谓的对象创建。
Optional<string> opt = Optional.empty();
String value = opt.orElseThrow(() -> new IllegalArgumentException("值不能为空")); // 触发抛出</string>
如果 Optional 有值,就直接返回该值,不执行 lambda。
简化写法:使用无参构造函数
若异常类型有无参构造函数(如 RuntimeException、NullPointerException),可直接传类引用:
Optional<user> userOpt = findUserById(123); User user = userOpt.orElseThrow(UserNotFoundException::new); // 推荐:简洁且语义清晰</user>
注意:UserNotFoundException 需是继承自 Throwable 的类,并提供无参构造器(或编译器自动生成)。
和 get() / orElse() 的关键区别
对比更能看清设计意图:
-
get():为空时直接抛NoSuchElementException,无法自定义异常类型和消息 -
orElse(null):返回 null,把空值风险甩给调用方,易引发 NPE -
orElseThrow(...):由你掌控异常类型、消息、堆栈起点,符合“快速失败”和“明确契约”的原则
所以,只要业务上“空=错误”,就优先选 orElseThrow,别用 get()。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











