我遇到了 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;
});
有什么理由应该发生这种情况吗?在我看来,这非常令人惊讶。