栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

是否CompletionStage总是将异常包装在CompletionException中?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

是否CompletionStage总是将异常包装在CompletionException中?

这些方法是否可能收到除以外的其他异常

CompletionException

是的,有可能,并且您不应该

CompletionException
未经
instanceof
检查(或检查使用情况)而投身到。

举个例子

CompletableFuture<Void> root = new CompletableFuture<>();root.whenComplete((v, t) -> {    System.out.println(t.getClass()); // class java.io.IOException});root.completeExceptionally(new IOException("blow it up"));

whenComplete
将收到
IOException
而不是
CompletionException
包装它。同样的行为适用于
exceptionally
handle


阶段的计算在Javadoc中定义:

由一个阶段执行的计算可被表达为一个

Function

Consumer
Runnable
根据(使用名称,包括应用,接受或运行,分别方法)是否需要参数和/或产生的结果。

我相信这句话

如果阶段的计算由于(未经检查的)异常或错误而突然终止

指的是其中的一个

Function#apply
Consumer#accept
Runnable#run
方法突然终止,因为一个的抛出的异常,而不是因为一个阶段格外通过一些其他机制完成。

另请注意,Javadoc说

该界面未定义用于初始创建,强制正常或 异常
强制完成,探查完成状态或结果或等待阶段完成的方法。的实现

CompletionStage
可以酌情提供实现这种效果的手段

换句话说,该接口允许实现在不突然终止任何计算的情况下出色地完成阶段。我认为这允许新的行为。


如果我们从以前扩展我的例子

CompletableFuture<Void> root = new CompletableFuture<>();CompletableFuture<Void> child = root.whenComplete((v, t) -> {    System.out.println(t.getClass()); // class java.io.Exception});child.whenComplete((v, t) -> {    System.out.println(t.getClass()); // class java.util.concurrent.CompletionException});root.completeExceptionally(new IOException("blow it up"));

您会注意到随附的完成文件会

child
收到
CompletionException
原始文件的包装
IOException
。从Javadoc来看,这对我来说并不明显

返回一个新的,

CompletionStage
具有与该阶段 相同的 结果或 异常

总而言之,似乎来自a的原始异常

completeExceptionally
被传递给直接的从属,而从属的从属却收到一个封闭的
CompletionException



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/452997.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号