当前位置: 首页 > 面试题库 >

功能性Java-whenComplete与异常之间的交互

沈琨
2023-03-14
问题内容

在此代码中:

doSomethingThatMightThrowAnException()
  .whenComplete((result, ex) -> doSomethingElse()})
  .exceptionally(ex -> handleException(ex));

当有一个例外,从doSomethingThatMightThrowAnException,都doSomethingElsehandleException运行,或者是通过异常无论是消费whenComplete还是exceptionally

编辑:

doSomethingThatMightThrowAnException返回CompletableFuture,可能是completeExceptionally。这是我所谈论的例外。


问题答案:

的文档whenComplete说:

返回一个 具有与此阶段相同的结果或异常 的新CompletionStage ,该阶段 在此阶段完成时执行给定的操作。

(强调我的)

这意味着该阶段不会吞噬异常,因为它应该具有相同的结果或异常。但是,您可能通过这样的事实感到惊讶的是后续阶段将获得前一阶段内的包裹外CompletionException,所讨论的在这里,所以它不是完全一样的例外:

CompletableFuture<String> test=new CompletableFuture<>();
test.whenComplete((result, ex) -> System.out.println("stage 2: "+result+"\t"+ex))
    .exceptionally(ex -> { System.out.println("stage 3: "+ex); return ""; });
test.completeExceptionally(new IOException());

将打印:

stage 2: null   java.io.IOException
stage 3: java.util.concurrent.CompletionException: java.io.IOException

请注意,您始终可以在一个阶段上附加多个操作,而不是随后进行链接:

CompletableFuture<String> test=new CompletableFuture<>();
test.whenComplete((result, ex) -> System.out.println("stage 2a: "+result+"\t"+ex));
test.exceptionally(ex -> { System.out.println("stage 2b: "+ex); return ""; });
test.completeExceptionally(new IOException());



stage 2b: java.io.IOException
stage 2a: null  java.io.IOException

当然,由于现在阶段2a和之间没有依赖关系2b,因此它们之间没有排序,并且在异步操作的情况下,它们可以同时运行。



 类似资料:
  • 上次,我发现了Java8及以上版本函数式编程的难点,并在Collectors类中发现了一个静态方法。 我们有一个类员工像: 假设我们有一个类的POJO列表,并且我们希望接收一个所有员工姓名的列表。我们有两种方法,比如: 我知道第一种方法在上使用终端操作,而第二种方法在上使用中间操作,但我想知道第一种方法的性能是否比第二种方法差,反之亦然。如果您能解释第一种情况的潜在性能下降,当我们的数据源(emp

  • 问题内容: 我正在运行以下代码,但有时在运行时会出现某种并发异常。 我对其进行了重构以解决并发问题,但这确实使我提出了一个问题。如果将for构造更改为Iterator模式,性能会有所不同吗?foreach构造和Iterator类之间的访问级别有什么区别? 问题答案: 区别主要在于语法糖,不同之处在于可以从迭代中删除项目。从技术上讲,增强的循环使您可以循环遍历所有,其中至少包括s和数组。 不必担心性

  • 问题内容: 我正在计算稀疏自动编码器的算法。我已经使用和在python中实现了它。代码几乎相同,但是性能却大不相同。matlab完成任务所需的时间为0.252454秒,而numpy为0.973672151566,几乎是原来的四倍。在最小化问题中,我将在以后多次调用此代码,因此这种差异会导致实现之间的延迟几分钟。这是正常行为吗?如何提高numpy的性能? numpy实现: Sparse.rho是调整

  • 是的,这是一个老话题,但我还是有些困惑。 在爪哇,人们说: LinkedList的插入速度比ArrayList快。这里插入是什么意思?如果这意味着向后移动一些元素,然后将元素放在中间的空点,那么ArrayList应该比LinkedList慢。如果插入只意味着添加(对象)操作,这怎么会慢呢?

  • 问题内容: 有一个共识,使用接口比使用类更好。我当然同意:库法接受ArrayList替代的List将是一个废话。 也有一个共识,就是性能总是一样的。在这里,我的基准要求不同。 接口和抽象类结果都有1到4种实现。当使用两个以上的实现时,性能开始出现差异。我正在寻找这种行为的解释(以及错误共识的由来)。 问题答案: 有一个共识,使用接口比使用类更好。 这太简单了。接口和抽象类都 具有彼此之间的优势。