MST
星途 面试题库

面试题:Java 中 CompletableFuture AnyOf 关系下的异常处理

现有多个 CompletableFuture 任务,通过 anyOf 方法组合,要求在其中一个任务因除零错误抛出异常时,能够捕获异常并在控制台打印异常信息,同时继续监控其他任务,当其他任务中有成功完成的,获取其结果并打印。请写出实现代码,并解释异常处理机制在这种场景下是如何工作的。
15.1万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

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

public class CompletableFutureExample {
    public static void main(String[] args) {
        CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> {
            // 模拟除零错误
            return 10 / 0;
        });

        CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 20);

        CompletableFuture<Object> combinedFuture = CompletableFuture.anyOf(future1, future2);

        combinedFuture.whenComplete((result, ex) -> {
            if (ex != null) {
                System.out.println("捕获到异常:");
                ex.printStackTrace();
            } else {
                System.out.println("任务成功完成,结果: " + result);
            }
        });

        // 防止主线程退出
        while (!combinedFuture.isDone()) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

异常处理机制解释

  1. anyOf 方法CompletableFuture.anyOf 方法会返回一个新的 CompletableFuture,当任何一个传入的 CompletableFuture 完成(正常完成或异常完成)时,这个新的 CompletableFuture 就会完成。
  2. 异常捕获:通过 whenComplete 方法,它接收两个参数,一个是结果(如果任务正常完成),另一个是异常(如果任务异常完成)。当其中一个任务抛出异常时,ex 参数不为 null,此时可以在 whenComplete 的代码块中捕获并处理异常,这里通过打印异常堆栈信息来处理。
  3. 继续监控其他任务anyOf 方法并不会因为其中一个任务抛出异常就停止监控其他任务。即使 future1 抛出异常,future2 仍然会继续执行。当 future2 成功完成时,combinedFuture 也会完成,并且 whenComplete 中的 result 参数会包含 future2 的结果,从而打印出成功完成任务的结果。