1

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

让我们想象一下这样的场景: 3 class Meeting, Room, Projector

一个会议可能已经设置了一个房间,并且里面可能有一个投影仪。

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

Meeting meeting = someMethod();
return meeting.getRoom().getProjector().getModelName();

此代码可以正确返回投影仪的型号名称,不幸的是,此代码也可能导致异常:java.lang.NullPointerException如果包含在根类 Meeting(甚至是 Meeting 类)中的类之一为空。

为了防止这个问题,并在最坏的情况下获得一个默认值,我们应该检查每个调用的返回值。

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

4

3 回答 3

6

使用Optional

return Optional.ofNullable(someMethod())
    .map(Meeting::getRoom)
    .map(Room::getProjector)
    .map(Projector::getModelName)
    .orElse("No Projector Exist");

顺便说一句,考虑返回Optionalnull从您的方法返回 - 必须将您String的值与特殊的硬编码值进行比较以检测null情况会变得很烦人......

于 2019-04-02T10:36:36.493 回答
0

检查一个 if 语句中的所有空条件也可以如下完成。这样代码会更容易阅读。

    if (meeting != null && meeting.getRoom() != null && meeting.getRoom().getProjector() != null) {
        return meeting.getRoom().getProjector().getModelName();
    } else {
        return "No Projector Exist";
    }

最好的方法是将空检查移至私有方法。因此,当您提供会议对象时,它会执行所需的检查并将项目的模型作为字符串返回。所以你的代码会更简单,也不会那么复杂。

于 2019-04-02T10:22:36.473 回答
-2

您可以从您的and方法catch()NullPointerExceptionor 抛出 aNoRoomException和 a并捕获它们。NoProjectorExceptiongetRoom()getProjector()

于 2019-04-02T10:25:57.977 回答