java completablefuture 中处理异常的核心做法是调用 exceptionally() 方法,该方法接收一个函数作为参数,当异步任务抛出异常时会自动执行该函数并返回默认值。如果希望将异常转换为另一个完成阶段(例如继续执行后续逻辑),可以使用 handle() 方法,它同时提供正常结果和异常对象供你统一处理。

使用 exceptionally() 捕获异常并返回默认值
exceptionally() 专门用于处理异常分支,它只会在上游任务抛出异常时被触发,此时你可以返回一个替代值来保证流程继续。这种方法适合那些允许失败降级或提供缺省值的场景,比如网络请求超时后返回缓存数据。

import java.util.concurrent.CompletableFuture;
public class ExceptionalExample {
public static void main(String[] args) {
CompletableFuture<string> future = CompletableFuture.supplyAsync(() -> {
throw new RuntimeException("模拟异常");
});
String result = future.exceptionally(ex -> "默认返回值")
.join();
System.out.println(result);
}
}</string>
运行上述代码会输出:默认返回值。这证明了 exceptionally() 成功拦截了异常并提供了后备方案。
使用 handle() 统一处理正常与异常情况
handle() 方法比 exceptionally() 更通用,它在任务完成(无论成功还是失败)后都会执行。通过检查传入的 Throwable 参数是否为空,可以区分当前是正常结果还是异常状态,从而进行不同的业务逻辑处理。

import java.util.concurrent.CompletableFuture;
public class HandleExample {
public static void main(String[] args) {
CompletableFuture<string> future = CompletableFuture.supplyAsync(() -> {
throw new RuntimeException("模拟异常");
});
String result = future.handle((res, ex) -> {
if (ex != null) {
return "处理异常: " + ex.getMessage();
}
return "处理结果: " + res;
}).join();
System.out.println(result);
}
}</string>
运行上述代码会输出:处理异常: 模拟异常。这表明 handle() 能够捕获异常并进行自定义的逻辑分支处理。
基于程序中某个输入、条件或结果的具体问题
在上面的示例中,我们使用了 supplyAsync() 并强制抛出了异常。如果我们将输入条件改为正常返回,exceptionally() 将不会被调用,而 handle() 中的 ex 参数将为 null。这种差异决定了你在设计 API 时应选择哪种处理方式:如果只需要兜底,用 exceptionally();如果需要精细控制,用 handle()。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











