MST

星途 面试题库

面试题:Java CompletableFuture thenCompose异常处理与链式调用

编写一个Java程序,利用CompletableFuture的thenCompose方法实现一个链式的异步操作。首先发起一个异步任务,该任务模拟从数据库查询用户ID。然后使用thenCompose方法将这个ID作为参数,发起另一个异步任务来查询该用户的详细信息。要求在整个过程中正确处理可能出现的异常,例如数据库连接失败(以抛出RuntimeException模拟),并在异常发生时打印错误信息。
42.5万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class CompletableFutureChainingExample {

    public static void main(String[] args) {
        CompletableFuture<String> userIdFuture = CompletableFuture.supplyAsync(() -> {
            // 模拟从数据库查询用户ID
            if (Math.random() < 0.5) {
                throw new RuntimeException("数据库连接失败");
            }
            return "12345";
        });

        CompletableFuture<String> userInfoFuture = userIdFuture.thenCompose(userId ->
                CompletableFuture.supplyAsync(() -> {
                    // 模拟根据用户ID查询用户详细信息
                    if (Math.random() < 0.5) {
                        throw new RuntimeException("数据库连接失败");
                    }
                    return "用户详细信息,ID: " + userId;
                })
        );

        userInfoFuture.exceptionally(ex -> {
            System.err.println("发生异常: " + ex.getMessage());
            return "默认用户信息";
        }).thenAccept(System.out::println);

        try {
            // 阻塞主线程等待结果
            System.out.println(userInfoFuture.get());
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }
}

上述代码实现了链式异步操作:

  1. CompletableFuture.supplyAsync 方法发起第一个异步任务,模拟从数据库查询用户ID,并且有一定概率抛出 RuntimeException 模拟数据库连接失败。
  2. thenCompose 方法将第一个异步任务返回的用户ID作为参数,发起第二个异步任务,模拟根据用户ID查询用户详细信息,同样有一定概率抛出 RuntimeException 模拟数据库连接失败。
  3. exceptionally 方法捕获整个链式操作过程中可能出现的异常,并打印错误信息,返回默认值。
  4. thenAccept 方法用于处理最终的结果并打印。
  5. get 方法用于阻塞主线程等待结果,在实际应用中,如果不希望主线程阻塞,可以省略这部分。