可选用于避免Java8中的NullPointerException。
但是当我使用可选的平面地图时,代码有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了。
我想知道为什么?
发布于 2018-12-08 03:26:03
insurance字段Car总是null。永远不要让一个Optional成为null,这就挫败了拥有一个Optional的整个想法。而且经常会引起令人惊讶的NullPointerException。这也是在您的代码中发生的事情。
我建议使用以下版本的Car类:
public static class Car {
private Insurance insurance = null;
public Optional<Insurance> getInsurance() {
return Optional.ofNullable(insurance);
}
}它解决了这个问题,所以现在的输出是:
未知
声明insurance为Optional没有意义(我可以看到)。这已经足够让你的发烧友返回一个了。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中的建议。
https://stackoverflow.com/questions/53679130
复制相似问题