orElseThrow是Optional中在值为空时惰性抛出异常的方法,需传入Supplier,避免提前创建异常对象,语义明确且支持链式调用。

orElseThrow 是 Optional 中用于在值不存在(即 Optional 为空)时主动抛出异常的方法。它避免了手动判空再 throw 的冗余代码,让逻辑更简洁、语义更明确。
基本用法:提供 Supplier 异常实例
必须传入一个 Supplier<throwable></throwable>,即一个能“生产异常”的 lambda 或方法引用。它只在 Optional 为 empty() 时才执行。
- ✅ 正确写法(推荐):
String value = opt.orElseThrow(() -> new IllegalArgumentException("用户名不能为空"));
- ❌ 错误写法(会立即创建异常,不满足惰性):
常用场景:替代 if + throw 模式
比如从 Map 或 Service 获取对象,希望缺失时快速失败并给出具体错误信息:
- 从 Map 查用户,没查到就抛业务异常:
User user = Optional.ofNullable(userCache.get(userId))
.orElseThrow(() -> new UserNotFoundException("用户 ID " + userId + " 未找到"));
- 调用可能返回 null 的旧 API:
Order order = orderOpt.orElseThrow(OrderNotExistsException::new);
与 orElse / orElseGet 的关键区别
orElseThrow 和 orElseGet 一样是惰性求值——仅当 Optional 为空时才执行 Supplier;而 orElse 会无条件执行参数表达式(即使 Optional 非空),可能导致不必要开销或副作用。
立即学习“Java免费学习笔记(深入)”;
- 安全:用
orElseThrow(() -> new Xxx())不会提前构造异常对象 - 清晰:代码直白表达“这里必须有值,否则报错”
- 统一:配合 Optional 链式调用(如 map/filter)保持风格一致
进阶技巧:复用异常工厂方法
如果多个地方抛相同类型异常,可提取为静态方法,提升可读性和复用性:
private static IllegalArgumentException missing(String field) {return new IllegalArgumentException(field + " 为 null,不允许");
}
// 使用:
String name = Optional.ofNullable(user.getName()).orElseThrow(() -> missing("姓名"));


















