Пытаясь понять функциональность exceptionally
, я прочитал несколько блоги и сообщения, но не понимаю, что не так с этим кодом:
public CompletableFuture<String> divideByZero(){
int x = 5 / 0;
return CompletableFuture.completedFuture("hi there");
}
Я думал, что смогу поймать исключение при вызове метода divideByZero
с помощью exceptionally
или handle
, но программа просто печатает трассировку стека и завершает работу.
Я пробовал оба или handle
и exceptionally
:
divideByZero()
.thenAccept(x -> System.out.println(x))
.handle((result, ex) -> {
if (null != ex) {
ex.printStackTrace();
return "excepion";
} else {
System.out.println("OK");
return result;
}
})
Но результат всегда:
Exception in thread "main" java.lang.ArithmeticException: / by zero
Когда вы вызываете divideByZero()
, код int x = 5 / 0;
запускается немедленно в потоке вызывающей стороны, что объясняет, почему он не работает, как вы описываете (исключение возникает еще до создания объекта CompletableFuture
).
Если вы хотите, чтобы деление на ноль выполнялось в будущей задаче, вам может потребоваться изменить метод на что-то вроде этого:
public static CompletableFuture<String> divideByZero() {
return CompletableFuture.supplyAsync(() -> {
int x = 5 / 0;
return "hi there";
});
}
Что заканчивается на Exception in thread "main" java.util.concurrent.ExecutionException: java.lang.ArithmeticException: / by zero
(вызвано java.lang.ArithmeticException: / by zero
)
ваш этот блок должен быть внутри try catch, если он может вызвать исключение return CompletableFuture.completedFuture («привет»); }