Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗jvSpCfEr 188 of 322 menu
◀ ▶

Ошибки 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().

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить