面试题答案
一键面试捕获异常的方式及代码示例
- 使用
whenComplete
方法import java.util.concurrent.*; import java.util.concurrent.CompletableFuture; public class CompletableFutureExceptionHandling { private static final ExecutorService executor = Executors.newFixedThreadPool(10); public static void main(String[] args) { CompletableFuture<Void> future = CompletableFuture.runAsync(() -> { if (Math.random() > 0.5) { throw new RuntimeException("Simulated exception"); } System.out.println("Task completed successfully"); }, executor); future.whenComplete((v, ex) -> { if (ex != null) { System.out.println("Caught exception: " + ex.getMessage()); } }).thenRun(() -> { executor.shutdown(); }); } }
- 使用
exceptionally
方法import java.util.concurrent.*; import java.util.concurrent.CompletableFuture; public class CompletableFutureExceptionHandling2 { private static final ExecutorService executor = Executors.newFixedThreadPool(10); public static void main(String[] args) { CompletableFuture<Void> future = CompletableFuture.runAsync(() -> { if (Math.random() > 0.5) { throw new RuntimeException("Simulated exception"); } System.out.println("Task completed successfully"); }, executor); future.exceptionally(ex -> { System.out.println("Caught exception: " + ex.getMessage()); return null; }).thenRun(() -> { executor.shutdown(); }); } }
不同处理方式的优缺点
whenComplete
方法- 优点:
- 可以同时处理正常结果和异常情况,能在任务完成后统一进行后续处理,无论任务成功还是失败都可以执行相同的后续逻辑。
- 缺点:
- 无法返回一个替代结果来处理异常情况。如果需要对异常情况返回特定值用于后续链式调用,
whenComplete
方法不太适用。
- 无法返回一个替代结果来处理异常情况。如果需要对异常情况返回特定值用于后续链式调用,
- 优点:
exceptionally
方法- 优点:
- 专门用于处理异常,并且可以返回一个替代结果。这在需要根据异常情况返回不同结果以继续链式调用
CompletableFuture
的操作时非常有用。
- 专门用于处理异常,并且可以返回一个替代结果。这在需要根据异常情况返回不同结果以继续链式调用
- 缺点:
- 只能处理异常情况,对于正常结果没有直接的处理方式。如果同时需要对正常结果进行处理,还需要结合其他方法(如
thenApply
等)。
- 只能处理异常情况,对于正常结果没有直接的处理方式。如果同时需要对正常结果进行处理,还需要结合其他方法(如
- 优点: