sfd*_*dev 2 java java-8 completable-future
我是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));
}
Run Code Online (Sandbox Code Playgroud)
这并不是CompletableFuture一般工作方式的缺陷,而是方便方法的缺陷,都是使用不允许检查异常的功能接口.您可以使用替代supplyAsync方法解决此问题:
public static <T> CompletableFuture<T> supplyAsync(Callable<T> c) {
CompletableFuture<T> f=new CompletableFuture<>();
CompletableFuture.runAsync(() -> {
try { f.complete(c.call()); } catch(Throwable t) { f.completeExceptionally(t); }
});
return f;
}
Run Code Online (Sandbox Code Playgroud)
这基本上与原始版本相同supplyAsync,但允许检查异常.因此,您可以像在原始尝试中一样使用它,只重定向初始supplyAsync调用.
CompletableFuture<Void> mt = supplyAsync(MetadataLoginUtil::login)
.exceptionally(e -> { System.out.println(e); return null; } )
.thenAccept(e -> System.out.println(e));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3302 次 |
| 最近记录: |