Я играл с 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.
Я что-то пропустил?