MST

星途 面试题库

面试题:Java CompletableFuture链式调用中的异常处理

在CompletableFuture链式调用中,如果其中一个异步操作抛出异常,如何优雅地处理这个异常,保证整个链式调用的流程不会中断,并且能够将异常信息传递到合适的处理环节?请结合代码示例说明。
15.1万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

在CompletableFuture链式调用中,可以使用exceptionally方法优雅地处理异常,确保整个链式调用流程不会中断,并将异常信息传递到合适的处理环节。以下是代码示例:

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

public class CompletableFutureExceptionHandling {
    public static void main(String[] args) {
        CompletableFuture.supplyAsync(() -> {
            if (Math.random() < 0.5) {
                throw new RuntimeException("模拟异步操作抛出异常");
            }
            return "异步操作正常结果";
        })
       .thenApply(result -> {
            System.out.println("处理正常结果: " + result);
            return result.toUpperCase();
        })
       .exceptionally(ex -> {
            System.out.println("捕获到异常: " + ex.getMessage());
            return "默认结果";
        })
       .thenAccept(finalResult -> System.out.println("最终结果: " + finalResult));

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

在上述代码中:

  1. supplyAsync 开启一个异步操作,这个操作可能会抛出异常。
  2. thenApply 用于处理异步操作的正常结果。
  3. exceptionally 捕获前面异步操作中抛出的异常,打印异常信息,并返回一个默认结果,保证链式调用不会中断。
  4. thenAccept 处理最终结果,无论是正常结果还是异常处理后的默认结果。