Java 处理避免NullPointerException的链式方法调用-哪种是最好的方法? 处理避免NullPointerException的链式方法调用-哪种是最好的方法?
让我们想象一下这种情况: 3类Java 处理避免NullPointerException的链式方法调用-哪种是最好的方法? 处理避免NullPointerException的链式方法调用-哪种是最好的方法?,java,Java,让我们想象一下这种情况: 3类会议,房间,投影仪 一个会议可能会设置一个房间,里面可能有一个投影仪 现在假设我想知道投影仪的型号。 最自然的事情是做类似的事情 Meeting meeting = someMethod(); return meeting.getRoom().getProjector().getModelName(); 此代码可以正确返回投影仪的型号名称, 不幸的是,如果根类Meeting(甚至Meeting类)中包含的某个类为null,则此代码也可能导致一个例外:java.la
会议
,房间
,投影仪
一个会议可能会设置一个房间,里面可能有一个投影仪
现在假设我想知道投影仪的型号。
最自然的事情是做类似的事情
Meeting meeting = someMethod();
return meeting.getRoom().getProjector().getModelName();
此代码可以正确返回投影仪的型号名称,
不幸的是,如果根类Meeting(甚至Meeting类)中包含的某个类为null,则此代码也可能导致一个例外: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的最佳方法是什么?检查一条if语句中的所有null条件也可以按如下方式进行。 这样代码就更容易阅读了
if (meeting != null && meeting.getRoom() != null && meeting.getRoom().getProjector() != null) {
return meeting.getRoom().getProjector().getModelName();
} else {
return "No Projector Exist";
}
最好的方法是将空检查移动到私有方法。因此,当您给出一个meeting对象时,它会进行必要的检查,并以字符串形式返回项目的模型。因此,您的代码将更加简单且不那么复杂。您可以catch()
使用getRoom()
和getProjector()
方法抛出noroomeexception
和NoProjectorException
并捕获它们。使用:
作为旁白,考虑从您的方法中返回<代码>可选<代码>或<代码> null >代码>将您的<代码>字符串< /代码>与特殊硬编码值进行比较,以检测<代码> null <代码>情况将变得令人厌烦…
您可以在下面的问题中找到答案。return Optional.ofNullable(someMethod())
.map(Meeting::getRoom)
.map(Room::getProjector)
.map(Projector::getModelName)
.orElse("No Projector Exist");