这些方法是否可能收到除以外的其他异常
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。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)