Как бросить исключение из лямбда-выражения с помощью .orElseThrow в Java - PullRequest
2 голосов
/ 10 октября 2019

Я получил ошибку компиляции

Compilation failure
[ERROR]  unreported exception java.lang.Throwable; must be caught or declared to be thrown

Почему этот код не компилируется

Collections.singletonList(Arrays.asList("a", "b", "c")
    .stream()
    .findAny()
    .orElseThrow(() -> {
        String msg = "Failed";
        throw new IllegalArgumentException(msg);
    }));

, хотя это выглядит нормально

Collections.singletonList(Arrays.asList("a", "b", "c")
    .stream()
    .findAny()
    .orElseThrow(() -> new IllegalArgumentException("Failed")));

это связано с https://bugs.openjdk.java.net/browse/JDK-8056983 или первый блок кода неправильный?

В VS Code и в Eclipse я не получаю синтаксическую ошибку от IDE.

1 Ответ

2 голосов
/ 10 октября 2019

Два фрагмента кода различны. В первом случае вы выбрасываете исключение в лямбду. Во втором случае вы возвращаете исключение из лямбды.

Чтобы согласовать два фрагмента, измените первый на

Collections.singletonList(Arrays.asList("a", "b", "c")
    .stream()
    .findAny()
    .orElseThrow(() -> {
        String msg = "Failed";
        return new IllegalArgumentException(msg);
    }));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...