MST
星途 面试题库

面试题:Java CompletableFuture如何处理异常并保证链式调用的连续性

在使用CompletableFuture进行多步异步操作的链式调用时,若其中某一步抛出异常,如何处理该异常,同时保证后续的异步操作(如果有的话)能继续按照逻辑执行下去?请给出详细的代码示例。
23.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(() -> {
            // 模拟第一步异步操作
            System.out.println("Step 1 started");
            if (Math.random() < 0.5) {
                throw new RuntimeException("Step 1 failed");
            }
            return "Step 1 result";
        })
       .thenApply(result -> {
            // 模拟第二步异步操作
            System.out.println("Step 2 started with result: " + result);
            return "Step 2 processed: " + result;
        })
       .exceptionally(ex -> {
            // 捕获第一步的异常
            System.out.println("Caught exception in Step 1: " + ex.getMessage());
            return "Default value due to Step 1 failure";
        })
       .thenApply(result -> {
            // 这一步会继续执行,无论第一步是否成功
            System.out.println("Step 3 started with result: " + result);
            return "Step 3 processed: " + result;
        })
       .thenAccept(System.out::println)
       .join();
    }
}

在上述代码中:

  1. supplyAsync方法开始第一步异步操作,这里可能会抛出异常。
  2. thenApply方法进行第二步异步操作,依赖第一步的结果。
  3. exceptionally方法捕获第一步可能抛出的异常,并返回一个默认值。
  4. 后续的thenApplythenAccept方法会继续执行,不受第一步异常的影响,因为exceptionally方法已经处理了异常并提供了一个替代值。

通过这种方式,即使链式调用中的某一步抛出异常,后续的异步操作依然可以按照逻辑继续执行。