让我们想象一下这种情况:
3类Meeting
,Room
,Projector
会议可能设置了一个会议室,并且其中可能有投影仪。
现在假设我想知道投影机的型号是什么。 最自然的事情就是做类似的事情
Meeting meeting = someMethod();
return meeting.getRoom().getProjector().getModelName();
此代码可以正确返回投影仪的型号名称,
不幸的是,如果根类Meeting中包含的一个类(甚至是Meeting类)为空,则该代码也可能导致Exeption:java.lang.NullPointerException
。
为了防止出现此问题,并在最坏的情况下获得默认值,我们应该检查每个调用的返回值。
Meeting meeting = someMethod();
if (meeting != null) {
Room room = meeting.getRoom();
if (room != null) {
Projector projector = room.getProjector();
if (projector != null) {
return projector.getModelName;
}
}
}
return "No Projector Exist";
现在的代码非常讨厌。
处理此类链接方法调用以避免NullPointerException的最佳方法是什么?
答案 0 :(得分:2)
使用Optional
:
service.submit(new PerformanceFileReader(f));
顺便说一句,考虑从您的方法中返回return Optional.ofNullable(someMethod())
.map(Meeting::getRoom)
.map(Room::getProjector)
.map(Projector::getModelName)
.orElse("No Projector Exist");
或Optional
-必须将null
与特殊的硬编码值进行比较,以检测到String
的情况累了...
答案 1 :(得分:0)
在一个if语句中检查所有空条件也可以如下进行。 这样代码将更容易阅读。
if (meeting != null && meeting.getRoom() != null && meeting.getRoom().getProjector() != null) {
return meeting.getRoom().getProjector().getModelName();
} else {
return "No Projector Exist";
}
最好的方法是将空检查移到私有方法。因此,当您提供会议对象时,它会进行必要的检查并以字符串形式返回项目模型。因此,您的代码将变得更简单,更简单。
答案 2 :(得分:-2)
您可以catch()
NullPointerException
或从NoRoomException
和NoProjectorException
方法中抛出getRoom()
和getProjector()
并捕获它们。 / p>