- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有人可以解释一下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
除了帮助我们了解函数是否确实有返回值之外,还提供了哪些可能的好处
最佳答案
假设您想要获取函数返回的字符串,将其转换为大写,然后打印出来。如果您有:
String someFunc() { ... }
您可能会想写:
System.out.println(someFunc().toUpperCase());
当然,如果someFunc
返回null
,则会抛出NullPointerException
。相反,假设我们有这个:
Optional<String> someFunc() { ... }
然后
System.out.println(someFunc().toUpperCase());
不起作用,因为 Optional
没有 toUpperCase
方法。此时,希望您会遇到一个 Optional
,这应该会让您考虑 Optional
为空的情况。这有助于避免 NPE,但可能只是在一定程度上。
现在您可能会关注如何从 Optional
中获取值,并且您可能会忘记空的情况。啊,有一个 get
方法:
System.out.println(someFunc().get().toUpperCase());
这会带来与 NPE 相同的问题,只不过异常是 NoSuchElementException
。因此,如果您盲目地在 Optional
上调用 get
,那么实际上与在引用上调用方法而不检查它是否为 null 几乎是一样的。
(因此,Brian Goetz 认为 Optional.get
是 Java 8 中最大的错误。请参阅他对 Angelika Langer 的采访 JAX 2015 Fragen und Antworten zu Java 8 大约 16 分钟。我不是当然它是最大的,但这是一个错误。人们只是不期望 get
抛出异常。)
如果您勤于检查空引用或空选项,那么
Optional<String> os = someFunc();
if (os.isPresent()) {
System.out.println(os.get().toUpperCase());
}
与旧版相比几乎没有什么进步
String s = someFunc();
if (s != null) {
System.out.println(s.toUpperCase());
}
Optional
的真正优点是它是一个库类,具有相当丰富的 API,可以安全地处理空情况。通常可以通过将几个方法调用链接到首先返回Optional
的方法来处理Optional
中可能包含的值。例如,我们可以将上面的示例重写如下:
someFunc().map(String::toUpperCase)
.ifPresent(System.out::println);
关于java - 空检查与可选 isPresent 检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57716555/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!