MST

星途 面试题库

面试题:Java中CompletableFuture异步任务常见的异常处理方式有哪些

在Java的CompletableFuture异步任务执行过程中,可能会出现各种异常。请列举至少两种常见的异常处理方式,并简要说明每种方式的使用场景和原理。
14.3万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 使用exceptionally方法
    • 使用场景:适用于当异步任务出现异常时,希望返回一个默认值或者进行简单的异常处理并返回替代结果的场景。
    • 原理exceptionally方法接收一个Function作为参数,当CompletableFuture出现异常时,会调用这个Function,将异常作为参数传入,在Function中可以根据异常情况返回一个替代结果。例如:
CompletableFuture.supplyAsync(() -> {
    if (Math.random() < 0.5) {
        throw new RuntimeException("模拟异常");
    }
    return "正常结果";
}).exceptionally(ex -> {
    System.out.println("捕获到异常: " + ex.getMessage());
    return "默认结果";
}).thenAccept(System.out::println);
  1. 使用whenComplete方法
    • 使用场景:如果需要在异步任务完成(无论是正常完成还是异常完成)后进行一些通用的处理操作,例如记录日志等,whenComplete方法较为合适。
    • 原理whenComplete方法接收两个参数,一个是异步任务正常完成时的结果,另一个是任务执行过程中抛出的异常(如果有)。通过这个方法可以在任务结束后统一处理正常和异常情况。例如:
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);
    }
});
  1. 使用handle方法
    • 使用场景:当需要根据异步任务的执行结果(正常或异常)来返回一个新的结果时,handle方法比较适用。它结合了whenCompleteexceptionally的部分功能。
    • 原理handle方法接收一个BiFunction,第一个参数是异步任务正常完成时的结果,第二个参数是异常(如果有)。BiFunction返回一个新的结果,无论任务是正常完成还是异常完成,都会返回这个新结果。例如:
CompletableFuture.supplyAsync(() -> {
    if (Math.random() < 0.5) {
        throw new RuntimeException("模拟异常");
    }
    return "正常结果";
}).handle((result, ex) -> {
    if (ex != null) {
        System.out.println("捕获到异常: " + ex.getMessage());
        return "异常处理后的结果";
    }
    return result + " 处理后";
}).thenAccept(System.out::println);