CompletableFuture和特殊情况-这里缺少什么?

时间:2019-06-11 11:17:11

标签: java exception java-8 completable-future

当我尝试理解exceptionally功能时,我读了几个blogsposts,但是我不明白这段代码有什么问题:

 public CompletableFuture<String> divideByZero(){
    int x = 5 / 0;
    return CompletableFuture.completedFuture("hi there");
}

我认为当用divideByZeroexceptionally调用handle方法时,我将能够捕获异常,但是该程序只打印堆栈跟踪并退出。

我尝试了handleexceptionally两者:

            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 个答案:

答案 0 :(得分: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引起)