MST

星途 面试题库

面试题:Java中CompletableFuture异步任务执行结果存储的异常处理优化

在使用CompletableFuture执行异步任务并存储结果时,可能会遇到任务执行异常的情况。请阐述如何优雅地处理这些异常,使得异常信息能够与结果一同存储或在不影响其他任务执行的情况下进行特殊处理,同时说明如何利用CompletableFuture的相关方法实现。
25.7万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 异常处理与结果一同存储
    • 可以使用CompletableFutureexceptionally方法。该方法在任务发生异常时会返回一个替代的结果,同时将异常信息包含在这个替代结果中(可以自定义这种包含方式)。
    • 示例代码如下:
    CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
        // 模拟可能抛出异常的任务
        if (Math.random() > 0.5) {
            throw new RuntimeException("任务执行异常");
        }
        return "任务正常结果";
    }).exceptionally(ex -> {
        // 处理异常,将异常信息与结果一同存储
        return "异常信息: " + ex.getMessage();
    });
    future.thenAccept(System.out::println);
    
  2. 不影响其他任务执行的特殊处理
    • 使用handle方法。handle方法无论任务是正常完成还是发生异常,都会执行提供的回调函数。在回调函数中可以根据是否有异常来进行不同的处理,同时不会影响其他并行的CompletableFuture任务。
    • 示例代码如下:
    CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
        if (Math.random() > 0.5) {
            throw new RuntimeException("任务1执行异常");
        }
        return "任务1正常结果";
    });
    CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "任务2正常结果");
    
    future1.handle((result, ex) -> {
        if (ex != null) {
            // 对任务1的异常进行特殊处理
            System.out.println("任务1发生异常: " + ex.getMessage());
            return "任务1异常处理后的结果";
        }
        return result;
    }).thenAccept(System.out::println);
    
    future2.thenAccept(System.out::println);
    

通过上述方式,利用CompletableFutureexceptionallyhandle方法,可以优雅地处理异步任务执行时的异常,满足异常信息与结果一同存储或在不影响其他任务执行的情况下进行特殊处理的需求。