Java 处理避免NullPointerException的链式方法调用-哪种是最好的方法? 处理避免NullPointerException的链式方法调用-哪种是最好的方法?

Java 处理避免NullPointerException的链式方法调用-哪种是最好的方法? 处理避免NullPointerException的链式方法调用-哪种是最好的方法?,java,Java,让我们想象一下这种情况: 3类会议,房间,投影仪 一个会议可能会设置一个房间,里面可能有一个投影仪 现在假设我想知道投影仪的型号。 最自然的事情是做类似的事情 Meeting meeting = someMethod(); return meeting.getRoom().getProjector().getModelName(); 此代码可以正确返回投影仪的型号名称, 不幸的是,如果根类Meeting(甚至Meeting类)中包含的某个类为null,则此代码也可能导致一个例外:java.la

让我们想象一下这种情况: 3类
会议
房间
投影仪

一个会议可能会设置一个房间,里面可能有一个投影仪

现在假设我想知道投影仪的型号。 最自然的事情是做类似的事情

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");