Метод completeExceptionally
Метод completeExceptionally завершает
CompletableFuture с ошибкой. Если футура
ещё не завершена, она переводится в состояние
завершения с указанным исключением. Все
зависимые вычисления и обработчики, которые
будут вызваны после этого, получат это
исключение. В параметр мы передаём объект
исключения, которое должно быть установлено
как причина завершения. Метод возвращает
true, если футура была успешно
завершена этим вызовом, и false, если
она уже была завершена ранее.
Если футура уже завершена (успешно или с ошибкой), вызов метода не изменяет её состояние.
Синтаксис
boolean completeExceptionally(Throwable ex)
Пример
Давайте создадим незавершённую футуру и завершим её исключением:
import java.util.concurrent.CompletableFuture;
public class Main
{
public static void main(String[] args)
{
CompletableFuture<String> future = new CompletableFuture<>();
boolean res = future.completeExceptionally(new RuntimeException("Something went wrong"));
System.out.println(res);
System.out.println(future.isCompletedExceptionally());
}
}
Результат выполнения кода:
true
true
Пример
Давайте попробуем завершить футуру исключением
повторно. Второй вызов вернёт false,
так как футура уже завершена:
import java.util.concurrent.CompletableFuture;
public class Main
{
public static void main(String[] args)
{
CompletableFuture<String> future = new CompletableFuture<>();
boolean first = future.completeExceptionally(new RuntimeException("Error 1"));
boolean second = future.completeExceptionally(new RuntimeException("Error 2"));
System.out.println(first);
System.out.println(second);
}
}
Результат выполнения кода:
true
false
Пример
Давайте завершим футуру исключением и
посмотрим, как это исключение обрабатывается
через метод exceptionally:
import java.util.concurrent.CompletableFuture;
public class Main
{
public static void main(String[] args)
{
CompletableFuture<String> future = new CompletableFuture<>();
future.completeExceptionally(new RuntimeException("Something went wrong"));
CompletableFuture<String> handled = future.exceptionally(ex -> "Recovered: " + ex.getMessage());
System.out.println(handled.join());
}
}
Результат выполнения кода:
"Recovered: Something went wrong"
Смотрите также
-
класс
CompletableFuture,
который представляет асинхронное вычисление -
метод
complete,
который завершает футуру значением -
метод
exceptionally,
который обрабатывает исключение -
метод
handle,
который обрабатывает результат и исключение