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:你好
较新的是修复还是回归?什么是相关票?
有一个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)