MST

星途 面试题库

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

在使用CompletableFuture.allOf() 组合多个异步任务时,如果其中某个任务抛出异常,如何优雅地捕获并处理这些异常?请提供代码实现,并解释处理机制。
12.9万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

代码实现

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

public class CompletableFutureExceptionHandling {
    public static void main(String[] args) {
        CompletableFuture<Void> future1 = CompletableFuture.runAsync(() -> {
            System.out.println("Task 1 is running");
        });

        CompletableFuture<Void> future2 = CompletableFuture.runAsync(() -> {
            System.out.println("Task 2 is running");
            throw new RuntimeException("Task 2 failed");
        });

        CompletableFuture<Void> future3 = CompletableFuture.runAsync(() -> {
            System.out.println("Task 3 is running");
        });

        CompletableFuture<Void> allFutures = CompletableFuture.allOf(future1, future2, future3);

        allFutures.whenComplete((v, ex) -> {
            if (ex != null) {
                System.out.println("Caught exception: " + ex.getMessage());
            } else {
                System.out.println("All tasks completed successfully");
            }
        }).join();
    }
}

处理机制解释

  1. CompletableFuture.allOf():该方法用于组合多个CompletableFuture,只有当所有的CompletableFuture都正常完成时,它返回的CompletableFuture才会正常完成。如果其中任何一个CompletableFuture抛出异常,那么allOf返回的CompletableFuture也会以相同的异常完成。
  2. whenComplete((v, ex) -> {...}):这是一个用于注册回调的方法,无论CompletableFuture正常完成还是异常完成都会被调用。它接受两个参数,第一个参数v是CompletableFuture正常完成时的结果(在runAsync方法返回的CompletableFuture中,vnull,因为runAsync没有返回值),第二个参数ex是异常对象,如果CompletableFuture正常完成,exnull,如果出现异常,ex则为对应的异常实例。
  3. if (ex != null) {...}:在whenComplete的回调中,通过判断ex是否为null,可以确定是否有异常发生。如果ex不为null,就说明某个任务抛出了异常,这时可以对异常进行相应的处理,例如打印异常信息等。

这样就可以优雅地捕获并处理CompletableFuture.allOf()组合的多个异步任务中抛出的异常。