面试题答案
一键面试- 异常处理与结果一同存储:
- 可以使用
CompletableFuture
的exceptionally
方法。该方法在任务发生异常时会返回一个替代的结果,同时将异常信息包含在这个替代结果中(可以自定义这种包含方式)。 - 示例代码如下:
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> { // 模拟可能抛出异常的任务 if (Math.random() > 0.5) { throw new RuntimeException("任务执行异常"); } return "任务正常结果"; }).exceptionally(ex -> { // 处理异常,将异常信息与结果一同存储 return "异常信息: " + ex.getMessage(); }); future.thenAccept(System.out::println);
- 可以使用
- 不影响其他任务执行的特殊处理:
- 使用
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);
- 使用
通过上述方式,利用CompletableFuture
的exceptionally
和handle
方法,可以优雅地处理异步任务执行时的异常,满足异常信息与结果一同存储或在不影响其他任务执行的情况下进行特殊处理的需求。