java - 可选接口问题
问题描述
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 为空,那么您的可选抛出异常 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"));
}
推荐阅读
- python - 如何实现功能?
- flutter - Fluter 小部件未运行 initState 并将其正确传递给 Widget
- html - 按钮内的 Gif (HTML, CSS)
- c++ - 遍历资源字符串表
- javascript - 如何在当前浏览器中添加对新“可插入流”功能的支持?
- json - 从 API json 中删除 password_digest?
- java - Java 8 ZonedDateTime 格式日期
- pywin32 - 有人知道如何在虚拟环境中使用 pywin32 吗?
- php - PHP dom解析器:只有在另一个元素之后才获取元素计数?
- r - 在同一数据框中总结多个组的更好方法