ZPY博客

Java中CompletableFuture如何处理异常?

CompletableFuture中,我们可以使用exceptionally()handle()方法来处理异常

  1. exceptionally()方法

exceptionally()方法用于处理异常,它接收一个Function类型的参数,该参数表示一个函数,用于处理异常情况。如果异步任务执行过程中发生了异常,exceptionally()方法会捕获异常,并将异常传递给该函数进行处理。该函数返回一个结果,代表异常情况下的处理结果。

例如,下面的代码演示了如何使用exceptionally()方法处理异常:

CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
    // 执行异步计算任务
    if (Math.random() < 0.5) {
        throw new RuntimeException("计算出错");
    }
    return 42;
});

CompletableFuture<String> result = future
    .thenApplyAsync(i -> i * 2)
    .exceptionally(ex -> {
        System.out.println("计算出错:" + ex.getMessage());
        return 0;
    })
    .thenApplyAsync(i -> "计算结果是:" + i);

System.out.println(result.get());

在上面的代码中,异步计算任务中有一半的概率会抛出一个运行时异常。我们使用exceptionally()方法来处理异常情况,如果计算出错,就返回默认值0,并输出异常信息。最终,我们使用thenApplyAsync()方法对计算结果进行操作,并将结果转换为字符串输出。

  1. handle()方法

handle()方法与exceptionally()方法类似,它也可以处理异常情况。不同的是,handle()方法的处理结果包括正常情况和异常情况,因此我们需要在函数中分别处理这两种情况。

例如,下面的代码演示了如何使用handle()方法处理异常:

CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
    // 执行异步计算任务
    if (Math.random() < 0.5) {
        throw new RuntimeException("计算出错");
    }
    return 42;
});

CompletableFuture<String> result = future
    .thenApplyAsync(i -> i * 2)
    .handle((r, ex) -> {
        if (ex != null) {
            System.out.println("计算出错:" + ex.getMessage());
            return "默认值";
        } else {
            return "计算结果是:" + r;
        }
    });

System.out.println(result.get());

在上面的代码中,我们使用handle()方法来处理异常情况。如果计算出错,我们返回默认值,并输出异常信息;如果计算正常完成,我们返回计算结果,并在字符串前加上"计算结果是:"前缀。最终,我们将处理结果转换为字符串输出。