3 回答
TA贡献1802条经验 获得超5个赞
该方法foo不得抛出已检查的异常,而是不可声明的 RuntimeException。
class MyException extends RuntimeException
创建 Future 已经不执行foo,将在另一个调用中执行。所以不能扔任何东西。
private static CompletableFuture<String> test() {
return CompletableFuture.supplyAsync(() -> foo("b"));
}
可以通过超时get()或get超时等待完成。这将通过将其MyException包装为ExecutionException.
尝试 { 测试()。get();} catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.getCause().printStackTrace(); }
不要忘记拦截异常exceptionally:
try {
String s = test().exceptionally(throwable -> {
throwable.getCause().printStackTrace();
return "xxx"; }).get();
System.err.println("s=" + s);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
TA贡献1877条经验 获得超6个赞
您需要在 CompletableFuture 的实现中提供此已检查的 MyException 异常,因为它是“已检查的异常”,这意味着它是从 Exception 类派生的。要么为它提供服务,要么将 MyException 更改为从 RuntimeException 扩展,那么您就不需要提供它(捕获它)。
添加回答
举报