在Java的CompletableFuture中,completeExceptionally()和obtrudeException()方法都是用于传递异常的方法。它们的差别在于当异步任务已经完成时,它们的行为不一样。
当任务尚未完成时,两个方法的行为都一样,它们都会将给定异常传递给任务。
当任务已经完成时,completeExceptionally()会忽略已经计算出的结果(如果有的话),而直接抛出给定的异常。而obtrudeException()可在任务已经完成时,无论完成状态是成功还是失败, 设置给定异常.
例如,考虑以下代码:
CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {
try {
// does something
return "result";
} catch (Exception e) {
return "error";
}
});
// completeExceptionally
completableFuture.completeExceptionally(new RuntimeException("error"));
// obtrudeException
completableFuture.obtrudeException(new RuntimeException("error"));
在这段代码中,无论是调用completeExceptionally()还是obtrudeException(),都会将RuntimeException传递给任务。但是,如果经过处理之后,任务已经成功计算出了结果(这里是"result"),那么completeExceptionally()会忽略此结果,并直接抛出异常,而obtrudeException()则会将异常设置为已完成的结果。当我们调用get()方法时,会立即得到RuntimeException,而不是之前成功计算的结果。
因此,我们应根据具体情况选择适当的方法,以实现我们的需求。