whenComplete
方法处理异常情况:
whenComplete
方法会在任务(无论是正常完成还是异常完成)结束时执行。它接收两个参数,第一个参数是任务的结果(如果任务正常完成),第二个参数是任务执行过程中抛出的异常(如果有异常发生)。
- 示例代码如下:
import java.util.concurrent.CompletableFuture;
public class CompletableFutureExceptionHandling {
public static void main(String[] args) {
CompletableFuture.supplyAsync(() -> {
if (Math.random() > 0.5) {
throw new RuntimeException("Simulated exception");
}
return "Task completed successfully";
}).whenComplete((result, ex) -> {
if (ex != null) {
System.out.println("Exception occurred: " + ex.getMessage());
} else {
System.out.println("Result: " + result);
}
});
}
}
- 在上述代码中,
supplyAsync
方法异步执行一个任务,任务有50%的概率抛出异常。whenComplete
方法在任务结束时被调用,根据ex
是否为null
来判断任务是否异常完成,并进行相应处理。
- 在
whenComplete
中再次抛出异常的情况:
- 如果在
whenComplete
中再次抛出异常,这个异常不会被CompletableFuture
本身捕获和处理,它会像普通的未捕获异常一样传播。如果没有其他的异常处理机制,程序可能会终止。
- 示例代码如下:
import java.util.concurrent.CompletableFuture;
public class CompletableFutureExceptionInWhenComplete {
public static void main(String[] args) {
CompletableFuture.supplyAsync(() -> "Task completed successfully")
.whenComplete((result, ex) -> {
throw new RuntimeException("Exception in whenComplete");
});
}
}
- 在上述代码中,
supplyAsync
任务正常完成,但在whenComplete
中抛出了一个新的异常。这个异常没有被CompletableFuture
处理,会导致程序终止并在控制台打印异常堆栈信息。通常在实际应用中,建议在whenComplete
中正确处理异常,而不是再次抛出异常,以避免程序异常终止。