Я столкнулся с странным поведением метода 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;
});
Есть ли причина, почему это должно происходить? На мой взгляд, это довольно удивительно.