有人可以解释 Optional
如何帮助我们避免 NullPointerException
吗?
Optional<String> op = someFunc()
if(op.isPresent()) {
op.get();
}
String possibleNull = op.get();
这段代码也容易出现 NullPointerException
吗?如果是这样,那么为什么这个代码比
String op = someFunc()
if(op != null) {
op.get();
}
String possibleNull = op;
什么可能的好处 Optional
除了帮助我们知道一个函数是否真的有返回值这一事实之外
原文由 ffff 发布,翻译遵循 CC BY-SA 4.0 许可协议
比方说你想得到一个函数返回的字符串,把它转换成大写,然后打印出来。如果你有:
你可能会想写:
当然,这抛出
NullPointerException
如果someFunc
返回null
。相反,假设我们有这个:然后
不会工作,因为
Optional
没有toUpperCase
方法。此时——希望——你会遇到一个Optional
,这应该让你考虑Optional
为空的情况。这有助于避免 NPE,但可能只是一点点。现在您可能专注于如何从
Optional
中获取值,您可能会忘记空的情况。啊,有一个get
方法:这会带来与 NPE 相同的问题,除了异常是
NoSuchElementException
之外。因此,如果您盲目地在get
Optional
,这实际上与在不检查引用是否为 null 的情况下调用方法几乎是一样的。(出于这个原因, Brian Goetz 认为
Optional.get
是 Java 8 中最大的错误。请参阅他对 Angelika Langer JAX 2015 Fragen und Antworten zu Java 8 的采访,大约 16 分钟。我不确定它是最大的,但这是一个错误。人们只是不希望get
抛出异常。)如果您勤于检查空引用或空可选值,那么
几乎不比旧的好
Optional
的 真正 优势在于,它是一个库类,具有相当丰富的 API,可以安全地处理空情况。通常可以通过将几个方法调用链接到首先返回Optional
的方法来处理可能包含在Optional
中的值。例如,我们可以将上面的示例改写如下: