CompletableFuture
是 Java 8 引入的 CompletableFuture 类的一个实例,它表示一个异步计算的结果。对于 CompletableFutur
类型的实例,异常可能在以下情况下被抛出:
-
调用
get()
方法时抛出异常- 当你调用
CompletableFuture
的get()
方法时,如果异步计算过程中抛出了异常,这个异常会被封装成一个ExecutionException
并在get()
方法调用处抛出。 - 如果异步计算被取消了,
get()
方法会抛出一个CancellationException
。 - 如果等待异步计算结果的过程中被中断,
get()
方法会抛出一个InterruptedException
。
- 当你调用
-
调用
join()
方法时抛出异常join()
方法与get()
类似,但它会抛出一个未经检查的异常(CompletionException
),这使得你不必显式处理异常。- 如果异步操作中出现异常,
join()
会将其包装为CompletionException
抛出。
-
在异步计算过程中抛出异常
如果CompletableFuture
的计算逻辑中有异常抛出,这个异常将被捕获并存储在CompletableFuture
对象中。当你通过get()
或join()
方法尝试获取结果时,存储的异常将被抛出。 -
使用 exceptionally() 方法处理异常
你可以使用exceptionally()
方法来处理异步计算中抛出的异常。这个方法提供了一个回调函数,当异步计算抛出异常时,可以执行一些异常处理逻辑,或者提供一个替代的结果。 -
使用 handle() 方法处理异常
handle()
方法可以处理正常的计算结果和异常情况。它接收一个BiFunction
,这个函数有两个输入参数:计算的结果和抛出的异常。你可以在这个函数中根据异常的有无来决定如何处理。 -
使用 whenComplete() 方法观察异常
whenComplete()
方法提供了一个BiConsumer
,允许你在计算完成时,无论正常还是异常结束,都执行一些操作。
在所有这些情况中,只有当你试图获取 CompletableFuture
的结果时(如通过 get()
或 join()
),或者当你显式地处理异常(如通过 exceptionally()
、handle()
或 whenComplete()
),异常才会被抛出或处理。如果你不尝试获取结果或处理异常,CompletableFuture
中的异常可能会被忽略,并且不会影响调用者线程的执行流程。