Java中的可选平面图具有NullPointerException

时间:2018-12-08 03:04:27

标签: java nullpointerexception optional

可选用于避免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) personinsurance没有insurance时,我得到了name

我想知道为什么吗?

1 个答案:

答案 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中的建议。