MST
星途 面试题库

面试题:Java中CompletableFuture的exceptionally方法应用场景

请描述在Java中CompletableFuture的exceptionally方法主要适用于哪些业务场景,并给出一个简单示例代码说明其用法。
44.7万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

适用场景

  1. 异步任务异常处理:当使用 CompletableFuture 执行异步任务时,如果任务出现异常,exceptionally 方法可以方便地捕获并处理这个异常,而不需要在任务执行的代码块内部进行复杂的异常处理逻辑。
  2. 链式异步操作:在一系列链式的异步操作中,某个环节出现异常时,通过 exceptionally 可以优雅地处理异常,并返回一个默认值或者执行一些恢复操作,而不会中断整个链式操作。
  3. 容错处理:对于那些对结果有一定容错要求的业务,例如在获取数据时,如果远程服务偶尔出现故障,使用 exceptionally 可以返回本地缓存的数据或者默认数据,保证业务流程的基本可用。

示例代码

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class CompletableFutureExample {
    public static void main(String[] args) {
        CompletableFuture.supplyAsync(() -> {
            // 模拟可能出现异常的异步任务
            if (Math.random() > 0.5) {
                throw new RuntimeException("模拟异常");
            }
            return "任务成功结果";
        })
       .exceptionally(ex -> {
            System.out.println("捕获到异常: " + ex.getMessage());
            // 返回默认值
            return "默认值";
        })
       .thenAccept(System.out::println);

        // 防止主线程退出
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

在上述代码中,supplyAsync 开启一个异步任务,该任务有一定概率抛出异常。exceptionally 方法捕获到异常后,打印异常信息并返回默认值。最后通过 thenAccept 打印最终结果。