尝试&调用supplyAsync时捕获

时间:2016-11-24 22:45:09

标签: java java-8 completable-future

我是CompletableFuture的新手,我想调用一个可以抛出异常的方法MetadataLoginUtil :: login。但是,下面的代码没有编译,尽管我有特殊的'书面。它说我必须包装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));
}

2 个答案:

答案 0 :(得分:7)

这不是getResources()一般工作方式的缺陷,而是方便方法的缺陷,所有这些都使用不允许检查异常的功能接口。您可以使用其他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; } 相同,但允许检查异常。因此,您可以像在原始尝试中一样使用它,只重定向最初的supplyAsync电话。

supplyAsync

答案 1 :(得分:1)

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

它并不漂亮,但System.setProperty("webdriver.gecko.driver", "C:\\Users\\Desktop\\ecpipse2\\Selenium Library files\\geckodriver.exe"); driver = new FirefoxDriver(); baseUrl = "http://automationpractice.com/index.php"; driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); 的API似乎不能很好地处理已检查的异常。