У меня есть следующие определения классов.
Insurance.java
package Chapter10;
public class Insurance {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Car.java
package Chapter10;
import java.util.Optional;
public class Car {
private Optional<Insurance> insurance;
public Optional<Insurance> getInsurance() {
return insurance;
}
public void setInsurance(Optional<Insurance> insurance) {
this.insurance = insurance;
}
}
Person.java
package Chapter10;
import java.util.Optional;
public class Person {
private Optional<Car> car;
public Optional<Car> getCar() {
return car;
}
public void setCar(Optional<Car> car) {
this.car = car;
}
}
Теперь у меня следующий основной класс, но я получаю исключение NullPoinerException
для человека р.
package Chapter10;
import java.util.Optional;
public class OptionalTester {
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) {
Insurance iffco = new Insurance();
iffco.setName("IFFCO TOKIO");
Insurance argo = new Insurance();
argo.setName("HDFC ARGO");
Car i10 = new Car();
i10.setInsurance(Optional.of(iffco));
Car santro = new Car();
Person p = new Person();
p.setCar(Optional.of(santro));
Person p1 = new Person();
p1.setCar(Optional.of(i10));
System.out.println("---------------FROM PERSON GET INSURANCE----------------------");
Optional<Insurance> optInsurance = Optional.ofNullable(argo);
Optional<String> name = optInsurance.map(Insurance::getName);
System.out.println(getCarInsuranceName(Optional.of(p1)));
System.out.println(getCarInsuranceName(Optional.of(p)));
}
}
Я получаю NPE за линию Optional.of (p), я знаю, что у p1 есть машина, и у этой машины есть страховка, чтобы она работала.
В случае p страховки нет, поэтому я получаю NPE.
Но если я сделаю это с Optional.empty (), я правильно получу Unknown в качестве вывода.
Как мне сделать его более обобщенным, чтобы, если что-то сломалось, я получил Неизвестно ?