completablefuture 的 iscompletedexceptionally() 方法用于判断任务是否因抛出异常而完成。调用该方法会立即返回布尔值,若为 true 则表示任务已异常终止且未通过正常结果或异常处理机制恢复。在排查异步逻辑时,先检查此状态可快速定位失败节点,避免阻塞等待。

isCompletedExceptionally() 与 exceptionally() 的关系是什么
该方法是只读的状态查询接口,不会触发任何副作用;而 exceptionally() 是转换型回调,会在异常发生时执行并生成新的 CompletableFuture。如果任务已通过 exceptionally() 提供了默认值,isCompletedExceptionally() 将返回 false,因为此时任务被视为已成功完成(尽管内部可能曾发生过异常)。因此,两者结合使用时,前者反映的是“当前最终状态”,后者决定“是否发生异常”。

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class Demo {
public static void main(String[] args) throws ExecutionException, InterruptedException {
CompletableFuture<string> cf = CompletableFuture.supplyAsync(() -> {
throw new RuntimeException("fail");
});
// 注册异常处理器
cf.exceptionally(ex -> "recovered");
System.out.println(cf.isCompletedExceptionally()); // false
System.out.println(cf.get()); // recovered
}
}</string>
如何区分任务尚未开始、已完成和异常完成三种状态
仅靠 isCompletedExceptionally() 无法区分“未完成”和“已完成但非异常”。需配合 isDone() 使用:!cf.isDone() 表示仍在运行或未启动;cf.isDone() && !cf.isCompletedExceptionally() 表示成功完成;cf.isCompletedExceptionally() 表示异常完成。这三个条件互斥且覆盖所有终态。

import java.util.concurrent.CompletableFuture;
public class StatusCheck {
public static void main(String[] args) {
CompletableFuture<string> pending = new CompletableFuture();
CompletableFuture<string> success = CompletableFuture.completedFuture("ok");
CompletableFuture<string> failed = CompletableFuture.supplyAsync(() -> {
throw new NullPointerException();
});
System.out.println(pending.isDone()); // false
System.out.println(success.isCompletedExceptionally()); // false
System.out.println(failed.isCompletedExceptionally()); // true
}
}</string></string></string>
当多个阶段链式调用时,中间某步异常会影响后续 isCompletedExceptionally() 的判断吗
会。在链式调用中,若前驱阶段异常且未被 exceptionally() 或 handle() 捕获,则整个链将标记为异常完成。此时对任意下游阶段的 isCompletedExceptionally() 调用均返回 true,即使下游阶段本身未抛出异常。这是因为 CompletableFuture 的传播机制会将异常沿依赖树向上传播并标记所有相关实例。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











