Java 中的 Optional 类 orElseThrow() 方法

2025年1月7日 | 阅读 4 分钟

Java 的 Optional 类是一个显式的容器对象,它包含一个可能存在也可能不存在的非空值。它最初在 Java 8 中使用,以一种更强大、更安全的方式来处理可能为 null 的值。

在 Optional 类所有的方法中,我们可以重点关注 orElseThrow()。这个方法要么返回 Optional 中包含的值,要么在值缺失时抛出异常。

它提供了一种直接的方式来处理我们可能需要某个值,但该值可能不存在的情况;同时,它不会让我们遇到空指针异常。

目的和用法

Optional 类及其 orElseThrow() 方法主要有两个用途:为处理可选值提供更函数式的方法。Optional 在使用对象前进行空值检查的常见做法上更胜一筹,因为它在资源使用方面基于更声明式的方法。

当问题用“无”来解决时,许多与空引用相关的错误都会被消除,因为值的缺失得到了明确的处理。

文件名:OptionalOrelsethrow.java

输出

 
ERROR!
Exception in thread "main" java.lang.IllegalArgumentException: Value is absent
	at Main.lambda$main$0(Main.java:8)
	at java.base/java.util.Optional.orElseThrow(Optional.java:408)
	at Main.main(Main.java:8)   

解释

在此示例中,getValue() 方法用于演示返回的值可能为 null 的情况。它可以描绘一种场景,例如数据源是数据库或其他在线应用程序,其中函数的输出不是预先确定的。

创建 Optional: Optional.ofNullable(getValue()) 返回一个 java.util.Optional,其中包含 getValue() 方法的结果。如果结果为 null,则 Optional 为空。

使用 orElseThrow() 处理缺失: orElseThrow() 方法用于从 Optional 中提取值,或者在值不存在时抛出异常。

该方法接收一个 Supplier 函数式接口,该接口包含要抛出的异常。在这里,如果 Optional 为空,则会创建一个类型为 java.util.InvalidException 的异常,消息为“值不存在”。

输出: 如果 getValue() 不等于 null,则打印该值。如果 getValue() 返回 null,则抛出 IllegalArgumentException 以指示缺少必需的值。

显式空值处理: 与不使用 Optional 和 orElseThrow() 相比,这使得代码更加清晰易读。它确保了一个方法可以产生一个“缺失”的形式,并确保这种情况必须被处理。

降低 NullPointerException 的风险: 在 Optional 中,JVM 向开发者保证某个值可能不可用,从而最大限度地减少了 NullPointerException 的数量。

更简洁的代码: 这是一个优势,因为 Optional 可以通过消除对多个空值检查的需求来使代码稍微更简洁。

函数式风格: Optional 使用 map()、flatMap()、filter() 等许多函数来初始化和处理函数式编程,前提是包含的值存在。

注意事项

虽然 Optional 提供了许多好处,但并非没有需要考虑的地方:虽然 Optional 提供了许多好处,但并非没有需要考虑的地方

性能: 过度使用 Optional 可能导致创建可能不会被使用的对象,从而增加开销。通常建议在声明返回类型而不是字段或方法参数时使用。

异常处理: 使用 orElseThrow() 占位符时,开发者应选择适当的异常和信息丰富的错误消息。

不能取代 null: Optional 不是要在所有情况下取代 null 的使用。它是一种实用工具,仅适用于值可能缺失且需要频繁进行空值检查的情况。

结论

Optional orElseThrow() 也是一个基于 Java 的方法,它倾向于处理 Java 中可能缺失的值。因为它通过表明一个值“应该”存在来帮助编写更可靠、有良好文档和可扩展的代码。但在缺失的情况下,它提供了一种有效处理这种情况的技术。另一方面,像任何工具一样,必须恰当使用它,以免将代码的抽象性变成形式主义的奖杯。


下一个主题Java-precondition