CompletableFuture и исключительно - чего здесь не хватает? - PullRequest
1 голос
/ 11 июня 2019

Когда я пытаюсь понять функциональность 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;
                }

            })

Но результат всегда:

Исключение в потоке "main" java.lang.ArithmeticException: / по нулям

1 Ответ

1 голос
/ 11 июня 2019

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

...