我试图使用一些字符串创建一个非常简单的回调。 IDE的代码意义在于对异常的未经检查的调用抱怨。任何人都可以给我一个解决方案吗?最后的想法是包装一个网络调用,以便返回承诺的结果,我可以根据需要添加其他功能。
nw /home/myUsername/Documents/myNodeWebkitApps/helloWorld/myApp.nw
答案 0 :(得分:6)
首先,您的班级MakesANetworkCall
实现原始类型Supplier
而不是Supplier<String>
。这将有效地禁用类型检查并隐藏您所做的所有错误,因此这不是您应该担心的单一警告,因为这不是代码中唯一的错误:
传递给BiConsumer
的{{1}}应该能够使用whenComplete
作为其第二个参数。
传递给Throwable
的{{1}}应使用Function
并返回替代结果。
此外,您正在使用表达式exceptionally
作为目标调用Throwable
方法,并且您有一个过时的字符串创建表达式static
,其中简单常量new CompletableFuture<String>()
将做。通常,您似乎总是尝试使用不恰当的方法,即设计用于消耗您不使用的东西的方法,或者用于在没有方法的情况下提供值的方法。考虑一下:
new String("Major Tom reporting!")
这似乎是你的意图。如果您确保"Major Tom reporting!"
正确实现CompletableFuture.supplyAsync(new MakesANetworkCall())
.thenAccept(result -> System.out.println(result))
.exceptionally(e -> { e.printStackTrace(); return null;})
.thenRun(()->System.out.println("Last action of all!"));
,则应该在没有任何警告的情况下进行编译。
答案 1 :(得分:3)
您的核心问题是class MakesANetworkCall implements Supplier {
。这是使用原始类型,因此隐藏了进一步的问题。将其修复为class MakesANetworkCall implements Supplier<String> {
并修复所有后续问题,然后获得:
CompletableFuture.supplyAsync(new MakesANetworkCall())
// Not <String, String>
.whenComplete(new BiConsumer<String, Throwable>() {
@Override
public void accept(String result, Throwable t) {
System.out.println(result);
}
})
// Not <Exception,Exception>
.exceptionally(new Function<Throwable, String>() {
@Override
public String apply(Throwable t) {
t.printStackTrace();
// Must return a Streing
return t.getMessage();
}
}
).thenApplyAsync(new Function<String, String>() {
@Override
public String apply(String o) {
System.out.println("Last action of all!");
return null;
}
});
答案 2 :(得分:0)
CompletableFuture.exceptionally
的声明如下:
public CompletableFuture<T> exceptionally(Function<Throwable, ? extends T> fn);
你传递的是Function<Exception, Exception>
,而你应该传递Function<Throwable, String>
。