- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Optional 用于避免 Java 8 中的 NullPointerException。
但是当我使用可选平面 map 时,代码出现 NullPointerException。
代码如下:
import java.util.Optional;
public class test2 {
public static class Car {
public Optional<Insurance> insurance;
public Optional<Insurance> getInsurance() {
return insurance;
}
}
public static class Insurance {
public String name;
public String getName() {
return name;
}
}
public static class Person {
public Optional<Car> car;
public Optional<Car> getCar() {
return car;
}
}
public static String getCarInsuranceName(Optional<Person> person) {
return person.flatMap(Person::getCar)
.flatMap(Car::getInsurance)
.map(Insurance::getName)
.orElse("Unknown");
}
public static void main(String[] args) {
Person person = new Person();
Car car = new Car();
Insurance insurance = new Insurance();
// insurance.name = "test";
// car.insurance = Optional.of(insurance);
person.car = Optional.of(new Car());
String result= getCarInsuranceName(Optional.of(person));
System.out.println(result);
}
}
控制台信息:
Exception in thread "main" java.lang.NullPointerException
at java.util.Objects.requireNonNull(Objects.java:203)
at java.util.Optional.flatMap(Optional.java:241)
at test2.getCarInsuranceName(test2.java:29)
at test2.main(test2.java:41)
person
变量确实没有保险。但我想要得到的结果是Unknown
,而不是NullPointerException。
Java版本:
openjdk version "1.8.0_192"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_192-b12)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.192-b12, mixed mode)
当person
有insurance
并且insurance
没有name
时,我得到Unknown
.
我想知道为什么?
最佳答案
Car
的 insurance
字段始终为 null
。永远不要允许Optional
为null
,这违背了拥有Optional
的整个想法。并且经常会导致令人惊讶的 NullPointerException
。这也是您的代码中发生的情况。
我建议使用以下版本的 Car
类:
public static class Car {
private Insurance insurance = null;
public Optional<Insurance> getInsurance() {
return Optional.ofNullable(insurance);
}
}
它解决了问题,所以现在的输出是:
Unknown
(我认为)将保险
声明为可选
是没有意义的。你的 getter 返回一个就足够了。 Optional
主要用于返回值。它几乎没有其他好的用途。
编辑: @chrylis 发表了评论,似乎不喜欢普通引用字段和返回 Optional
的 getter 的组合。我认为这没有什么问题,但如果您希望将字段保留为Optional
(如问题中所示),那当然也是可能的。然后你只需要确保它不是 null
:
public static class Car {
private Optional<Insurance> insurance = Optional.empty();
public Optional<Insurance> getInsurance() {
return insurance;
}
}
这也修复了程序,因此我们得到了上面的输出。
讨论了 getter 是否应该返回Optional
in this question: Should Java 8 getters return optional type?我上面的第一个片段似乎更多地遵循 the least upvoted answer by Mark 中的建议.
关于java - Java 中的可选平面图有 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53679130/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!