首页 > 解决方案 > 可选接口问题

问题描述

RezerwacjaInfoDTO getRezerwacjaInfo(int rezerwacjaId) throws Exception {

    Integer osobaId = Math.abs(loginMgr.getLoggedUserInfo().getUserId());
    RezerwacjaInfoDTO rezInfo = rezMgr.getRezerwacjaInfo(rezerwacjaId);

    return Optional
            .ofNullable(rezInfo)
            .filter(rez -> rez.getOsobaId() == osobaId)
            .orElseThrow(() -> new Exception("Brak rezerwacji o podanym numerze"));
}

当我调用它时:

getRezerwacjaInfo(81504)

我得到了异常,但是 rezInfo.getOsobaId() == 81504 (我在调试器中看到它)

当我删除此行时:

.filter(rez -> rez.getOsobaId() == osobaId)

函数返回对象 RezerwacjaInfoDTO。

这条线有什么问题??

标签: javaoptional

解决方案


如果您的变量 rezInfo 为空,那么您的可选抛出异常 rezInfo.getOsobaId() == osobaId 为 true 则发生异常。

当您删除过滤器时,它不会引发异常,因为您的 rezInfo 不为空。

可能是另一种选择是在调用者方法中处理可选。

Optional<RezerwacjaInfoDTO> getRezerwacjaInfo(int rezerwacjaId) {

    Integer osobaId = Math.abs(loginMgr.getLoggedUserInfo().getUserId());
    RezerwacjaInfoDTO rezInfo = rezMgr.getRezerwacjaInfo(rezerwacjaId);

    return Optional
            .ofNullable(rezInfo);
}

void callerMethod() throws Exception {
    getRezerwacjaInfo(...)
            .filter(rez -> rez.getOsobaId() == osobaId)
            .orElseThrow(() -> new Exception("Brak rezerwacji o podanym numerze"));
}

推荐阅读