MST

星途 面试题库

面试题:Java中CompletableFuture的handle方法如何处理异常

请简述在Java中CompletableFuture的handle方法的作用,并且通过代码示例展示它是如何处理异步操作过程中可能出现的异常以及获取正常结果的。
46.5万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

CompletableFuture的handle方法作用

handle方法用于对CompletableFuture的结果进行处理,无论异步操作是正常完成还是出现异常。它接收一个BiFunction作为参数,该函数的两个参数分别是异步操作的结果(如果成功)和抛出的异常(如果失败),返回值会被包装成一个新的CompletableFuture

代码示例

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

public class CompletableFutureHandleExample {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        CompletableFuture.supplyAsync(() -> {
            // 模拟异步操作
            if (Math.random() > 0.5) {
                return "Success result";
            } else {
                throw new RuntimeException("Simulated exception");
            }
        })
       .handle((result, ex) -> {
            if (ex != null) {
                System.out.println("Caught exception: " + ex.getMessage());
                return "Default value due to exception";
            } else {
                System.out.println("Normal result: " + result);
                return result;
            }
        })
       .thenAccept(System.out::println);

        // 主线程等待异步操作完成
        Thread.sleep(2000);
    }
}

在上述代码中:

  1. CompletableFuture.supplyAsync启动一个异步任务,该任务以50%的概率成功返回一个字符串,50%的概率抛出异常。
  2. handle方法捕获异步任务可能出现的异常,并根据情况返回处理后的结果。如果出现异常,打印异常信息并返回默认值;如果没有异常,打印正常结果并返回该结果。
  3. thenAccept用于消费handle返回的新CompletableFuture的结果并打印。
  4. Thread.sleep(2000)用于主线程等待异步操作完成,以便观察输出结果。