在不同的Java 8次要版本下,CompletionException的不同消息

poi*_*rez 2 java openjdk java-8

我在不同的小版本java下从相同的代码片段获得不同的输出.我无法在开放的jdk bug跟踪器上找到相关的票证.

CompletableFuture<String> completableFuture = new CompletableFuture<>();
completableFuture.complete("xxx");

completableFuture.thenCompose(str -> {
    CompletableFuture<String> completableFuture1 = new CompletableFuture<>();
    completableFuture1.completeExceptionally(new Exception("hello"));
    return completableFuture1;
}).exceptionally(ex -> {
    System.out.println(ex.getMessage());
    return null;
}).get();
Run Code Online (Sandbox Code Playgroud)

JDK 1.8.0_25下的输出:

你好

JDK 1.8.0_102下的输出:

java.lang.Exception:你好

较新的是修复还是回归?什么是相关票?

Sot*_*lis 5

有一个bug报告在这里讨论这个变化.关键是在Javadoc中CompletableFuture#thenCompose

返回一个新的CompletionStage,当此阶段正常完成时,将使用此阶段作为所提供函数的参数执行.有关CompletionStage特殊完成的规则​​,请参阅文档.

和.和类文档 CompletionStage

在其他情况下,如果一个阶段的计算与(未经检查的)异常或错误而突然终止,则所有相关的阶段,要求其完成完整的异常,以及,一个 CompletionException拿着例外,因为它的原因.

这就是你在这里看到的.该Function传递给exceptionally现在收到CompletionException持有Exception已完成触发CompletableFuture.

您现在看到的行为是预期的行为.

您必须打开包装以获得特殊完成的原因

Throwable cause = ex.getCause(); // this is your Exception("Hello")
Run Code Online (Sandbox Code Playgroud)