Ошибки CompletableFuture в Java
Исключение в supplyAsync или в
thenApply не пропадает: следующие
преобразования пропускаются, пока цепочку не
«починят». Метод exceptionally вызывается
только при сбое и может вернуть запасное
значение того же типа.
Разбор строки с подстановкой нуля при ошибке:
import java.util.concurrent.CompletableFuture;
public class Main {
public static void main(String[] args) {
int value = CompletableFuture
.supplyAsync(() -> Integer.parseInt("x"))
.exceptionally(ex -> 0)
.join();
System.out.println(value);
}
}
Метод handle срабатывает и при успехе,
и при сбое. В колбэк приходят результат или
null и необязательное исключение;
можно вернуть новое значение или снова бросить
ошибку:
import java.util.concurrent.CompletableFuture;
public class Main {
public static void main(String[] args) {
String text = CompletableFuture
.supplyAsync(() -> "42")
.<String>handle((result, ex) -> {
if (ex != null) {
return "err";
}
return "ok:" + result;
})
.join();
System.out.println(text);
}
}
whenComplete похож на handle, но
не меняет значение для следующего звена: только
наблюдает исход. Если в колбэке бросить
исключение, оно заменит исходный результат
или сбой для последующих шагов.
Для ручного сценария есть completeExceptionally
на пустом объекте. В типичном сервисном коде
на Java 27 хватает exceptionally для
запасного ответа и whenComplete для
журнала.
Цепочка с supplyAsync(() -> 10 / 0): верните -1,
затем thenApply умножьте на 2
и выведите join().