Ожидая одинаковых результатов от этих двух CompletableFuture

Однако 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();
}

person slee    schedule 11.04.2017    source источник


Ответы (1)


Однако 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();
}
person shizhz    schedule 11.04.2017
comment
Ничего страшного, просто распространенная ошибка, которую все совершают во время обучения :-) - person shizhz; 12.04.2017