首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Java可选ifPresentOrElse方法时无法抛出“签入”异常

使用Java可选ifPresentOrElse方法时无法抛出“签入”异常
EN

Stack Overflow用户
提问于 2020-07-16 22:37:36
回答 2查看 10.2K关注 0票数 6

为什么在使用orElse java可选方法时不能在ifPresentOrElse部件中抛出选中的异常?

例如:

代码语言:javascript
运行
复制
dao.findBook(id).ifPresentOrElse(book -> {
    printingService.print(book, printerName);
    changeBookPrintDate(book.getId(), LocalDateTime.now());
}, () -> new BookNotFoundException());

其中BookNotFoundException是扩展Exception类的自定义异常(选中异常)。

但是,这段代码使编译器感到不安:

代码语言:javascript
运行
复制
unreported exception com...exception.BookNotFoundException; must be caught or declared to be thrown

(知道它已经被抛出在方法声明中,并且在这个块周围使用try catch并不能解决编译问题)。

但是,如果我们让BookNotFoundException扩展RuntimeException (这是未经检查的),那么所有这些都能很好地工作。

有人知道为什么吗?

在这个java 9可选方法中防止抛出这样的异常的原因是什么?

为什么我应该让我的异常成为一个RuntimeException来使它工作,而它更应该被认为是一个“自定义异常”而不是“运行时”呢?

这个question正在解决相同的问题,但是对于java8lambdas,所以我不知道是否同样适用于java9optionals。

其他researches除了确认it is not possible之外,什么也没做。

知道吗?

EN

回答 2

Stack Overflow用户

发布于 2021-02-10 20:34:37

必须添加带有方括号的抛出:

代码语言:javascript
运行
复制
*() -> { throw new BookNotFoundException(); }*
票数 16
EN

Stack Overflow用户

发布于 2020-07-17 12:48:13

当您希望指定两个非抛出操作时,方法ifPresentOrElse是一个有用的工具,因此在任何情况下都可以在方法调用之后继续。但是,当你想加入没有值的情况时,这是一个不必要的复杂问题。只管用

代码语言:javascript
运行
复制
var book = dao.findBook(id).orElseThrow(BookNotFoundException::new);
printingService.print(book, printerName);
changeBookPrintDate(book.getId(), LocalDateTime.now());

由于此构造将抛出一个缺失值,因此代码流将只对当前值继续。因此,您可以像普通局部变量一样在后续代码中使用book,但必须保证它永远不会是null

orElseThrow方法要求抛出异常的Supplier,而不是抛出的函数。这样,供应商就可以在不抛出异常的情况下构造一个检查异常,并且orElseThrow的通用签名声明将抛出供应商生成的任何类型。

public <X extends Throwable> T orElseThrow​(Supplier<? extends X> exceptionSupplier) throws X

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62944518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档