当我尝试理解exceptionally
功能时,我读了几个blogs和posts,但是我不明白这段代码有什么问题:
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:/减零
答案 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
引起)