如何解决简单完成completableFuture.exceptionally不会在完成exceptionly时触发
我不了解一些基本知识。
public static void main(String[] args) {
CompletableFuture<String> cf = new CompletableFuture<>();
cf = cf.exceptionally(throwable -> "inside exceptionally");
cf.completeExceptionally(new IOException());
String s = "im empty";
try {
s = cf.get();
} catch (InterruptedException e) {
System.out.println("inside InterruptedException catch");
} catch (ExecutionException e) {
System.out.println("inside ExecutionException catch");
}
System.out.println(s);
}
我希望这段代码输出什么?
异常里面
实际输出:
内部ExecutionException捕获
我为空
来自.exceptionally javadoc:
返回此CompletableFuture完成时完成的新CompletableFuture,异常的给定功能的结果在异常完成时触发此CompletableFuture的完成;否则,如果此CompletableFuture正常完成,则返回的CompletableFuture也将使用相同的值正常完成。
如果是这样,为什么触发了get的捕获? 我以为我完成它会异常地触发.exceptionally()方法并给我一个有效的String响应...
我想念什么?
解决方法
在此片段中
ExtraElements
您正在创建一个Metadata
,稍后将其完成并将其引用分配给CompletableFuture<String> cf = new CompletableFuture<>();
cf = cf.exceptionally(throwable -> "inside exceptionally");
。您随后调用的CompletableFuture
返回一个新的cf
引用,您将其分配回exceptionally
并导致丢失原始引用。
以后再打电话
CompletableFuture
您正在对cf
返回的cf.completeExceptionally(new IOException());
进行操作,而不是原始操作。原始
CompletableFuture
仍然不完整。
最后,当您致电
exceptionally
您将再次对CompletableFuture<String> cf = new CompletableFuture<>();
返回的s = cf.get();
执行此操作,该操作特别用CompletableFuture
完成。您会发现,如果您致电
exceptionally
在该catch块中,将包含该IOException
。
您正在链接期货,但希望同时操作两者。您想完成原稿并从e.getCause();
返回的结果中得到结果。因此,将它们都存储在自己的变量中并执行您的操作。例如,
IOException
将打印
exceptionally()
表示传递给{{1}的CompletableFuture<String> root = new CompletableFuture<>();
CompletableFuture<String> dependent = root.exceptionally(throwable -> "inside exceptionally");
root.completeExceptionally(new IOException());
String s = "im empty";
try {
s = dependent.get();
} catch (InterruptedException e) {
System.out.println("inside InterruptedException catch");
} catch (ExecutionException e) {
System.out.println("inside ExecutionException catch");
}
System.out.println(s);
是在inside exceptionally
Function
异常完成时执行的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。