Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring CompletableFuture是否在重新引发的异常上完成?_Spring_Java 8_Completable Future - Fatal编程技术网

Spring CompletableFuture是否在重新引发的异常上完成?

Spring CompletableFuture是否在重新引发的异常上完成?,spring,java-8,completable-future,Spring,Java 8,Completable Future,我刚刚开始使用CompletableFuture,并且已经爱上了它 但在我看来,当使用一个完全的未来时,有一件奇怪的事情是它的方法,叫做“例外” 假设我有一个 CompletableFuture cf1. 现在,一旦数据到达,我的代码就会应用一些处理逻辑。在出现异常的情况下,我使用exceptive方法重新显示MyCustomException cf1 .thenApply(myData->Some Processing Logic) .exceptionally(ex->

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

但在我看来,当使用一个完全的未来时,有一件奇怪的事情是它的方法,叫做“例外”

假设我有一个
CompletableFuture cf1.

现在,一旦数据到达,我的代码就会应用一些处理逻辑。在出现异常的情况下,我使用exceptive方法重新显示
MyCustomException

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

cf.get(); 
有趣的是,get方法的调用将无限期挂起,直到我终止程序。这是否意味着,如果CompletableFuture从Exceptional块重新抛出异常,则future将不会标记为complete?是否需要明确地将其标记为已完成?

从文档中,如果未来异常完成,则该方法将引发异常

CompletableFuture.allOf(completableFuture);
completableFuture.isCompletedExceptionally();  //true
ExecutionException-如果此未来异常完成

CompletableFuture.allOf(completableFuture);
completableFuture.isCompletedExceptionally();  //true
因此,您可以从
异常
返回一些值,以识别在
期间引发的异常,然后应用
并调用
获取
方法获取值

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

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

谢谢你的回答。我试着从
返回值,结果非常好。但另一种使用可完成未来的方式。异常情况下,再次被无限期挂起。语句的目的是什么
CompletableFuture.allOf(CompletableFuture)?正如本文所述,它没有任何效果,除了在某些情况下由于执行过时的操作而导致的轻微减速,除非JIT消除它。根据我的理解,如果
Main
线程不等待async Completable Future complete,若主线程检查future是否异常完成,它将始终返回false,对吗?如果我不确定,请@Holger纠正我。如果
completableFuture
尚未完成,则检查
completableFuture.iscompletedexceptionaly()
将返回
false
。语句
CompletableFuture.allOf(CompletableFuture)不会改变这一点。它创建了一个新的未来,该未来将在所有提供的参数都完成时完成,但您不使用结果。所以它只是稍微减慢了执行速度,但如果这同时导致了原始未来的完成,那纯粹是运气。您需要等待
allOf
结果的完成,但是,为什么不等待
completableFuture
的完成呢?
get
join
都将等待完成。但如果未来已经破例完成,他们也会抛出一个例外。如果只想等待完成而不需要捕获异常,可以使用
completableFuture.excellective(x->null.join()
,它将等待而不抛出(在正常情况下)。然后,您可以检查
completableFuture.isCompletedExceptionally()
。但这不是问题所在。OP声称,
get
将永远挂起,这在没有a的情况下是无法解决的,因为任何“等待完成”都应该有相同的行为。您的代码片段中没有
cf
。异常情况下,
的结果根本没有分配给任何变量。提供