我遇到了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;
});

有什么理由要发生这种情况吗?我认为这很令人惊讶。

最佳答案

此行为is specified in the class documentation of CompletionStage (fourth bullet):



如果您考虑要知道是否在失败的阶段调用了exceptionally或它的直接或间接先决条件之一,也就不足为奇了。

关于exception - Java 8 CompletableFuture的异常行为异常方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27430255/

10-13 07:07