【发布时间】:2021-11-17 12:53:49
【问题描述】:
为什么我们必须这样写?创建异常实例是否比创建供应商实例更昂贵?
var value = getOptional().orElseThrow(NullPointerException::new);
// instead of
var value = getOptional().orElseThrow(new NullPointerException());
【问题讨论】:
-
这可能是重复的,所以我不会将其添加为答案 - 但基本上,每次执行该行代码时,您的第二段代码都会创建一个
NullPointerException的新实例.第一段代码只在需要时构造异常 -
是否每次都创建供应商是一个实现细节; JLS 表示允许方法引用表达式(或 lambda 表达式)重用缓存值。
-
另一个区别是,原则上,您可以编写
.orElseThrow(() -> { ...; return new SomethingException(); }),其中...部分具有您想要在抛出某些东西的情况下执行的副作用(例如用于调试目的的日志记录) . -
@BogdanTischenko 是否创建供应商似乎是一个实施细节,但我认为更重要的是我们可以先验地判断创建供应商的成本是最低的。可以创建一个自定义异常类并潜入构造函数中解决 NP 完全问题。因此,对于创建异常的成本没有先验限制。
-
这本质上是 stackoverflow.com/q/33170109/2541560 的复制品,它的异常并没有改变任何东西。