CompletableFuture 是否在重新抛出异常时完成?

问题描述

我刚刚开始使用 CompletableFuture 并且已经爱上它了。

但是在我使用 CompletableFuture 时出现的一件奇怪的事情是它的方法被称为“异常”

假设我有一个 CompletableFuture<?> cf1.

现在,一旦数据到达,我的代码就会应用一些处理逻辑。如果出现异常,我使用异常方法重新抛出MyCustomException

cf1  
.thenApply(myData->Some Processing Logic)  
.exceptionally(ex-> throw new MyCustomException())

cf.get(); 

有趣的是,对 get 方法调用会无限期挂起,直到我终止程序。这是否意味着如果 CompletableFuture 从异常块中重新抛出异常,未来将不会被标记为完成?我需要明确地将其标记为完整吗?

解决方法

来自文档的 get 方法在未来异常完成时抛出异常

ExecutionException - 如果这个未来异常完成

因此,您可以从 exceptionally 返回一些值以识别在 thenApply 期间抛出的异常并调用 get 方法获取值

第二种方法,在调用get方法之前,可以使用allOf使future对象完成,并检查future是否异常完成

CompletableFuture.allOf(completableFuture);
completableFuture.isCompletedExceptionally();  //true