簡體   English   中英

Java中的可選平面圖具有NullPointerException

[英]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)

personinsuranceinsurance沒有name ,我得到了Unknown

我想知道為什么嗎?

Carinsurance字段始終為null 永遠不要讓Optionalnull ,這會挫敗擁有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM