- A+
在CompletableFuture中,我们可以使用exceptionally()和handle()方法来处理异常。
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()方法对计算结果进行操作,并将结果转换为字符串输出。
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()方法来处理异常情况。如果计算出错,我们返回默认值,并输出异常信息;如果计算正常完成,我们返回计算结果,并在字符串前加上"计算结果是:"前缀。最终,我们将处理结果转换为字符串输出。
