在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()
方法来处理异常情况。如果计算出错,我们返回默认值,并输出异常信息;如果计算正常完成,我们返回计算结果,并在字符串前加上"计算结果是:"前缀。最终,我们将处理结果转换为字符串输出。