为什么在使用orElse java可选方法时不能在ifPresentOrElse部件中抛出选中的异常?
例如:
dao.findBook(id).ifPresentOrElse(book -> {
printingService.print(book, printerName);
changeBookPrintDate(book.getId(), LocalDateTime.now());
}, () -> new BookNotFoundException());其中BookNotFoundException是扩展Exception类的自定义异常(选中异常)。
但是,这段代码使编译器感到不安:
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之外,什么也没做。
知道吗?
发布于 2021-02-10 20:34:37
必须添加带有方括号的抛出:
*() -> { throw new BookNotFoundException(); }*发布于 2020-07-17 12:48:13
当您希望指定两个非抛出操作时,方法ifPresentOrElse是一个有用的工具,因此在任何情况下都可以在方法调用之后继续。但是,当你想加入没有值的情况时,这是一个不必要的复杂问题。只管用
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
https://stackoverflow.com/questions/62944518
复制相似问题