我是CompletableFuture的新手,我想调用一个方法MetadataLoginUtil :: login,它可以引发异常。但是,尽管我写了“异常”的代码,但是下面的代码没有被编译。它说我必须在try&catch中包装MetadataLoginUtil :: login'。
请指教。提前谢谢!
public void run() throws ConnectionException {
CompletableFuture<Void> mt = CompletableFuture.supplyAsync(MetadataLoginUtil::login)
.exceptionally(e -> {
System.out.println(e);
return null;
})
.thenAccept(e -> System.out.println(e));
}
CompletableFuture.supplyAsync(Supplier<U>)
需要一个java.util.function.Supplier<U>
实例,并且Supplier.get()
方法的签名不允许检查的异常。为了清楚地看到这一点,请注意CompletableFuture.supplyAsync(MetadataLoginUtil::login)
相当于
CompletableFuture<Void> mt = CompletableFuture.supplyAsync(new Supplier<Void>() {
@Override
public Void get() {
return MetadataLoginUtil.login();
}
})
显然无法编译。
您可以处理内的异常Supplier
,将其更改CompletableFuture.supplyAsync(MetadataLoginUtil::login).exceptionally(e -> {System.out.println(e); return null; } )
为
CompletableFuture.supplyAsync(() -> {
try {
return MetadataLoginUtil.login();
} catch (Exception e) {
System.out.println(e);
return null;
}
})
它不是很漂亮,但是CompletableFuture
的API似乎无法很好地与已检查的异常一起使用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句