我遇到了Java 8 CompletableFuture.exceptionally方法的奇怪行为。如果执行此代码,它将正常工作并打印java.lang.RuntimeException
CompletableFuture<String> future = new CompletableFuture<>();
future.completeExceptionally(new RuntimeException());
future.exceptionally(e -> {
System.out.println(e.getClass());
return null;
});
但是,如果我在以后的处理中添加了另一个步骤,例如thenApply
,则异常类型更改为java.util.concurrent.CompletionException
,其中原始异常包装在其中。
CompletableFuture<String> future = new CompletableFuture<>();
future.completeExceptionally(new RuntimeException());
future.thenApply(v-> v).exceptionally(e -> {
System.out.println(e);
return null;
});
有什么理由要发生这种情况吗?我认为这很令人惊讶。
在CompletionStage
(第四个项目符号)的类文档中指定了此行为:
方法
handle
还允许该阶段计算替换结果,该替换结果可以实现其他从属阶段的进一步处理。在所有其他情况下,如果阶段的计算由于(未经检查的)异常或错误而突然终止,那么所有需要完成该阶段的从属阶段也会异常结束,并且CompletionException
将异常作为其原因。
如果您认为自己想知道是exceptionally
在失败的阶段调用的,还是它的直接或间接先决条件之一,也就不足为奇了。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句