gpt4 book ai didi

java - Java 中的可选平面图有 NullPointerException

转载 作者:行者123 更新时间:2023-12-02 10:29:46 25 4
gpt4 key购买 nike

Optional 用于避免 Java 8 中的 NullPointerException。

但是当我使用可选平面 map 时,代码出现 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)

personinsurance并且insurance没有name时,我得到Unknown.

我想知道为什么?

最佳答案

Carinsurance 字段始终为 null。永远不要允许Optionalnull,这违背了拥有Optional的整个想法。并且经常会导致令人惊讶的 NullPointerException。这也是您的代码中发生的情况。

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

    public static class Car {
private Insurance insurance = null;

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

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

Unknown

(我认为)将保险声明为可选是没有意义的。你的 getter 返回一个就足够了。 Optional 主要用于返回值。它几乎没有其他好的用途。

编辑: @chrylis 发表了评论,似乎不喜欢普通引用字段和返回 Optional 的 getter 的组合。我认为这没有什么问题,但如果您希望将字段保留为Optional(如问题中所示),那当然也是可能的。然后你只需要确保它不是 null:

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 中的建议.

关于java - Java 中的可选平面图有 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53679130/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com