MST
星途 面试题库

面试题:Java中CompletableFuture异常处理的基本方式

在Java的CompletableFuture中,通常有哪些基本方法用于处理异步任务执行过程中抛出的异常?请举例说明。
18.0万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

在Java的CompletableFuture中,处理异步任务执行过程中抛出异常的基本方法有:

  1. exceptionally:当CompletableFuture的计算结果异常时,会执行该方法返回的备用计算结果。
    CompletableFuture.supplyAsync(() -> {
        if (Math.random() < 0.5) {
            throw new RuntimeException("模拟异常");
        }
        return "正常结果";
    }).exceptionally(ex -> {
        System.out.println("捕获到异常: " + ex.getMessage());
        return "异常时的备用结果";
    }).thenAccept(System.out::println);
    
  2. whenComplete:无论CompletableFuture正常完成还是发生异常,都会执行该方法。它接收两个参数,第一个是正常的计算结果(如果有异常则为null),第二个是异常(如果正常完成则为null)。
    CompletableFuture.supplyAsync(() -> {
        if (Math.random() < 0.5) {
            throw new RuntimeException("模拟异常");
        }
        return "正常结果";
    }).whenComplete((result, ex) -> {
        if (ex != null) {
            System.out.println("捕获到异常: " + ex.getMessage());
        } else {
            System.out.println("正常结果: " + result);
        }
    });
    
  3. handle:结合了正常计算结果处理和异常处理,返回一个新的CompletableFuture。它接收两个参数,第一个是正常的计算结果(如果有异常则为null),第二个是异常(如果正常完成则为null),返回值可以作为新的CompletableFuture的计算结果。
    CompletableFuture.supplyAsync(() -> {
        if (Math.random() < 0.5) {
            throw new RuntimeException("模拟异常");
        }
        return "正常结果";
    }).handle((result, ex) -> {
        if (ex != null) {
            System.out.println("捕获到异常: " + ex.getMessage());
            return "异常时的备用结果";
        } else {
            System.out.println("正常结果: " + result);
            return result;
        }
    }).thenAccept(System.out::println);