[英]Optional flatmap in Java has NullPointerException
可選用於避免Java 8中的NullPointerException。
但是,當我使用Optional flatmap時,代碼具有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);
}
}
它解決了問題,因此現在的輸出為:
未知
(我可以看到)將insurance
聲明為Optional
是沒有意義的。 您的獲取者返回一個就足夠了。 Optional
的主要用於返回值。 它幾乎沒有其他好的用途。
編輯: @chrylis評論,似乎不喜歡普通參考字段和返回Optional
的getter的組合。 我認為這沒什么錯,但是如果您希望像問題中那樣將字段保留為Optional
,那當然也是可能的。 然后,您只需要確保它不為null
:
public static class Car {
private Optional<Insurance> insurance = Optional.empty();
public Optional<Insurance> getInsurance() {
return insurance;
}
}
這也修復了程序,因此我們得到了上面的輸出。
這個問題討論了一個吸氣劑是否應該返回Optional
:Java 8吸氣劑是否應該返回可選類型? 我上面的第一個片段似乎更多地遵循了Mark提出的最不受歡迎的答案中的建議。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.