期待来自这两个CompletableFutures的相同结果

时间:2017-04-11 05:53:56

标签: java completable-future

但是testCase2不处理异常并抛出错误。我错过了什么吗?对不起,如果我做了,对此很新。

@Test
public void testCase1() throws Exception {
    CompletableFuture.supplyAsync(() -> {
        if (true) throw new RuntimeException();
        return "Promise";
    }).exceptionally((ex) -> {
        return "Fake Promise";
    }).get();
}

@Test
public void testCase2() throws Exception {
    CompletableFuture<String> cf = CompletableFuture.supplyAsync(() -> {
        if (true) throw new RuntimeException();
        return "Promise";
    });
    cf.exceptionally((ex) -> {
        return "Fake Promise";
    });
    cf.get();
}

1 个答案:

答案 0 :(得分:2)

  

然而,testCase2不处理异常

您的testCase2确实处理了异常,您可以添加额外的print语句进行检查。

testCase2抛出异常的原因是代码:

cf.exceptionally((ex) -> {
        System.out.println("Fake Promise: " + System.nanoTime());
        return "Fake Promise";
    })

将返回一个新的CompletableFuture,但您只是将其丢弃,cf中的变量cf.get仍未在任何异常处理程序中注册。代码应该是:

@Test
public void testCase2() throws Exception {
    CompletableFuture<String> cf = CompletableFuture.supplyAsync(() -> {
        if (true) throw new RuntimeException();
        return "Promise";
    });
    CompletableFuture<String> handledCf = cf.exceptionally((ex) -> {
        return "Fake Promise";
    });
    return handledCf.get();
}