CompletableFuture и исключительно — чего здесь не хватает?

Пытаясь понять функциональность 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

ваш этот блок должен быть внутри try catch, если он может вызвать исключение return CompletableFuture.completedFuture («привет»); }

Vipul Pandey 11.06.2019 13:18
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
179
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда вы вызываете 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)

Другие вопросы по теме