可选用于避免Java 8中的NullPointerException。
但是当我使用可选平面图时,代码具有NullPointerException。
代码如下:
mkdir /usr/local/lib
mkdir /usr/local/lib/pkgconfig
brew link python
控制台信息:
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
,而不是NullPointerException。
Java版本:
Unknown
当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
。
我想知道为什么吗?
答案 0 :(得分:1)
insurance
的{{1}}字段始终为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
主要用于返回值。它还有其他一些很好的用途。
编辑:@chrylis发表了评论,似乎不喜欢普通参考字段和返回Optional
的getter的组合。我认为这没什么问题,但是,如果您要在问题中将字段保留为Optional
,那当然也是可能的。然后,您只需要确保它不是Optional
:
null
这也可以修复程序,因此我们得到上面的输出。
讨论了吸气剂是否应该返回public static class Car {
private Optional<Insurance> insurance = Optional.empty();
public Optional<Insurance> getInsurance() {
return insurance;
}
}
in this question: Should Java 8 getters return optional type?我上面的第一个片段似乎更多地遵循了the least upvoted answer by Mark中的建议。