MST
星途 面试题库

面试题:Java中CompletableFuture exceptionally方法链式调用及异常处理

假设有多个CompletableFuture任务通过thenApply等方法链式调用,在其中一个任务抛出异常后,如何通过exceptionally方法确保整个链式调用能正确处理异常,并返回一个默认值或进行特定的补救操作?请给出详细代码实现。
45.1万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

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

public class CompletableFutureExceptionHandling {
    public static void main(String[] args) {
        CompletableFuture.supplyAsync(() -> {
            // 模拟正常计算
            return 10;
        })
       .thenApply(result -> {
            // 模拟另一个计算,可能抛出异常
            if (result > 5) {
                throw new RuntimeException("计算出现异常");
            }
            return result * 2;
        })
       .exceptionally(ex -> {
            // 处理异常,返回默认值
            System.out.println("捕获到异常: " + ex.getMessage());
            return -1;
        })
       .thenAccept(System.out::println);
    }
}

在上述代码中:

  1. CompletableFuture.supplyAsync(() -> 10) 开始一个异步任务,返回 10
  2. thenApply(result -> {...}) 尝试对结果进行计算,这里模拟了可能抛出异常的情况。
  3. exceptionally(ex -> {...}) 捕获前面任务抛出的异常,并返回一个默认值 -1
  4. thenAccept(System.out::println) 输出最终结果,无论是正常结果还是异常处理后的默认值。