【发布时间】:2021-06-30 12:50:35
【问题描述】:
我正在开发一个函数,该函数采用CompletableFuture<Object> 并需要处理其结果(或其异常)。
我正在修改它,以便在某种情况下,我需要抛出一个异常。
但是,编译器告诉我我没有处理这个新异常 (Unhandled exception ...)。
函数如下所示:
-
//<-- THIS IS NOT OK行中是我刚刚添加的内容 -
//<-- THIS IS OK行中已经存在
代码:
public void myFunction(CompletableFuture<Object> resultSupplier, boolean someCondition) {
resultSupplier.handleAsync((result, throwable) -> {
if (throwable != null) {
//do something with the throwable
} else {
if (someCondition) {
throw new Throwable("some throwable"); //<-- THIS IS NOT OK ("Unhandled exception: java.lang.Throwable")
}
try {
//do something with the result which may raise an exception
} catch (Throwable ex) {
//do something in the catch
throw ex; //<-- THIS IS OK
} finally {
//do something to finalize
}
}
return null; //I don't actually need the future, just to execute the code above
});
}
我在理解这一点时遇到了一些麻烦。 为什么编译器可以重新抛出 try 块内捕获的 throwable,但重新抛出我添加的 throwable 就不行?
我必须说我更了解编译错误(我在 BiFunction<> 内,所以我不能抛出已检查的异常)而不是编译器对 catch 块内的 throw ex 感到高兴,但主要是我只是想了解这里发生了什么以及为什么两者之间存在差异。
附:您可以将代码 sn-p 复制粘贴到 IDE 中以轻松重现问题。
【问题讨论】:
-
@Slaw 它确实与您发布的第一个链接完全相同。当我进行第一次研究时,我只是没有输入正确的单词。我投票结束我自己的问题作为重复
标签: java