可再生未来吞下异常?
我一直在玩,注意到一件奇怪的事情。CompletableFuture
String url = "http://google.com";
CompletableFuture<String> contentsCF = readPageCF(url);
CompletableFuture<List<String>> linksCF = contentsCF.thenApply(_4_CompletableFutures::getLinks);
linksCF.thenAccept(list -> {
assertThat(list, not(empty()));
});
linksCF.get();
如果在我的调用中,断言失败,则不会传播异常。然后我尝试了更丑陋的东西:thenAccept
linksCF.thenAccept(list -> {
String a = null;
System.out.println(a.toString());
});
没有任何反应,没有传播任何异常。我尝试使用与 中的异常相关的方法和其他方法,但失败了 - 没有一个按预期传播异常。handle
CompletableFutures
当我调试 时,它确实捕获了这样的异常:CompletableFuture
final void internalComplete(T v, Throwable ex) {
if (result == null)
UNSAFE.compareAndSwapObject
(this, RESULT, null,
(ex == null) ? (v == null) ? NIL : v :
new AltResult((ex instanceof CompletionException) ? ex :
new CompletionException(ex)));
postComplete(); // help out even if not triggered
}
没有别的。
我使用的是JDK 1.8.0_05 x64,Windows 7。
我在这里错过了什么吗?