java - 可选接口(interface)问题

标签 java option-type

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。

这句话有什么问题吗?

最佳答案

如果您的变量 rezInfo 为 null,则您的可选抛出异常,并且 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"));
}

关于java - 可选接口(interface)问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51981850/

相关文章:

java - JSF/XHTML - 一个包含相同 xhtml 页面两次的 xhtml 页面

java - 如何使Android应用程序的图标背景透明?

java - 列表应该如何转换为具体的实现?

ios - 如何使用选项制作 switch 语句?

exception - Xtend 中Optional.orElseThrow 的正确语法是什么?

c++ - 使用 std::optional 参数调用函数

ios - 如何在 Swift 中分配一个可以为 null 的数组元素?

java - 双色椭圆形

swift - Swift 可选链是从左到右延迟计算的吗?

java - Jersey SSE - 事件 Output.write 在发送第一条消息后抛出空指针