首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可选的Java平台图有NullPointerException

可选的Java平台图有NullPointerException
EN

Stack Overflow用户
提问于 2018-12-08 03:04:27
回答 1查看 2.5K关注 0票数 1

可选用于避免Java8中的NullPointerException。

但是当我使用可选的平面地图时,代码有NullPointerException。

守则如下:

代码语言:javascript
复制
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);
  }
}

控制台信息:

代码语言:javascript
复制
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版本:

代码语言:javascript
复制
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了。

我想知道为什么?

EN

回答 1

Stack Overflow用户

发布于 2018-12-08 03:26:03

insurance字段Car总是null。永远不要让一个Optional成为null,这就挫败了拥有一个Optional的整个想法。而且经常会引起令人惊讶的NullPointerException。这也是在您的代码中发生的事情。

我建议使用以下版本的Car类:

代码语言:javascript
复制
    public static class Car {
        private Insurance insurance = null;

        public Optional<Insurance> getInsurance() {
            return Optional.ofNullable(insurance);
        }
    }

它解决了这个问题,所以现在的输出是:

未知

声明insuranceOptional没有意义(我可以看到)。这已经足够让你的发烧友返回一个了。Optional主要用于返回值。它几乎没有其他好的用途。

编辑: @chrylis注释,似乎不喜欢普通引用字段和返回Optional的getter的组合。我不认为它有什么问题,但是如果您希望像问题中那样保持您的字段为Optional,那当然也是可能的。那么你只需要确保它不是null

代码语言:javascript
复制
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中的建议。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53679130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档