处理链接方法调用以避免NullPointerException-最好的方法是什么?

时间:2019-04-02 10:09:28

标签: java

处理链接方法调用避免NullPointerException-哪种方法最好?

让我们想象一下这种情况: 3类MeetingRoomProjector

会议可能设置了一个会议室,并且其中可能有投影仪。

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

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的最佳方法是什么?

3 个答案:

答案 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或从NoRoomExceptionNoProjectorException方法中抛出getRoom()getProjector()并捕获它们。 / p>