MST

星途 面试题库

面试题:Java中CompletableFuture如何获取正常返回值与异常信息

请描述在Java中使用CompletableFuture时,获取正常返回值和捕获异常信息的常见方法,并给出简单代码示例。
45.2万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

获取正常返回值方法

  1. join()方法:此方法会阻塞当前线程,等待CompletableFuture完成并返回结果。如果CompletableFuture异常完成,join()方法会抛出未检查异常(CompletionExceptionExecutionException等)。
  2. get()方法:同样会阻塞当前线程等待结果。与join()不同的是,get()方法会抛出已检查异常(InterruptedExceptionExecutionException)。

捕获异常信息方法

  1. exceptionally()方法:当CompletableFuture异常完成时,会执行exceptionally()方法中的回调函数,返回一个替代结果。
  2. whenComplete()方法:无论CompletableFuture正常完成还是异常完成,都会执行whenComplete()方法中的回调函数,可在其中检查异常。
  3. handle()方法:结合了获取结果和处理异常的功能,无论正常或异常完成,都会执行该方法中的回调函数,返回一个新的CompletableFuture

代码示例

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

public class CompletableFutureExample {
    public static void main(String[] args) {
        // 创建一个CompletableFuture
        CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
            // 模拟一个可能会抛出异常的任务
            if (Math.random() < 0.5) {
                throw new RuntimeException("任务执行失败");
            }
            return "任务执行成功";
        });

        // 使用join()获取结果
        try {
            String result1 = future.join();
            System.out.println("join()获取的结果: " + result1);
        } catch (Exception e) {
            System.out.println("join()捕获的异常: " + e.getMessage());
        }

        // 使用get()获取结果
        try {
            String result2 = future.get();
            System.out.println("get()获取的结果: " + result2);
        } catch (InterruptedException | ExecutionException e) {
            System.out.println("get()捕获的异常: " + e.getMessage());
        }

        // 使用exceptionally()处理异常
        CompletableFuture<String> futureWithExceptionally = future.exceptionally(ex -> {
            System.out.println("exceptionally()捕获的异常: " + ex.getMessage());
            return "默认结果";
        });
        futureWithExceptionally.thenAccept(System.out::println);

        // 使用whenComplete()处理异常
        future.whenComplete((result, ex) -> {
            if (ex != null) {
                System.out.println("whenComplete()捕获的异常: " + ex.getMessage());
            } else {
                System.out.println("whenComplete()获取的结果: " + result);
            }
        });

        // 使用handle()处理异常
        CompletableFuture<String> futureWithHandle = future.handle((result, ex) -> {
            if (ex != null) {
                System.out.println("handle()捕获的异常: " + ex.getMessage());
                return "默认结果";
            }
            return result;
        });
        futureWithHandle.thenAccept(System.out::println);
    }
}