gpt4 book ai didi

java - 调用 supplyAsync 时尝试并捕获

转载 作者:行者123 更新时间:2023-12-01 14:05:21 28 4
gpt4 key购买 nike

我是 CompletableFuture 的新手,我想调用一个可以引发异常的方法 MetadataLoginUtil::login。但是,尽管我已经“异常”地编写了下面的代码,但并未编译。它说我必须将 MetadataLoginUtil::login' 包装在 try & catch 中。

请指教。
提前谢谢!

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 的缺陷。一般工作,但方便的方法,都使用不允许检查异常的功能接口(interface)。您可以使用替代方案 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;
}

这和原来的 supplyAsync基本是一样的,但允许检查异常。因此,您可以像在最初的尝试中一样正确使用它,只需重定向初始的 supplyAsync称呼。
CompletableFuture<Void> mt = supplyAsync(MetadataLoginUtil::login)
.exceptionally(e -> { System.out.println(e); return null; } )
.thenAccept(e -> System.out.println(e));

关于java - 调用 supplyAsync 时尝试并捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40795420/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com