Java8 Stream. OrElseThrow незарегистрированная ошибка исключения - PullRequest
6 голосов
/ 08 февраля 2020

Я пытаюсь отследить, почему специфическое c поведение происходит с .orElseThrow в потоке Java. Этот блок кода

private SomeContainer getSomeContainerFromList(SomeContainerList containerList, String containerId) {

   return containerList.stream()
           .filter(specificContainer -> specificContainer.getId().equals(containerId))
           .findAny()
           .orElseThrow(() -> {
               String message = "some special failure message";
               log.error(message);
               throw new CustomInternalException(message)});
}

приводит к этой ошибке: unreported exception X; must be caught or declared to be thrown

Я не хочу сообщать об исключении, потому что это заставило бы меня добавить это к любой другой метод, который взаимодействует с этим.

Однако, когда я удаляю лямбда-выражение с фигурными скобками, оставляя только новое исключение, которое должно быть выброшено, например, так:

private SomeContainer getSomeContainerFromList(SomeContainerList containerList, String containerId) {

   return containerList.stream()
           .filter(specificContainer -> specificContainer.getId().equals(containerId))
           .findAny()
           .orElseThrow(() -> new CustomInternalException("some special failure message"));
}

Он прекрасно компилируется, и исключение больше не нужно сообщается, однако, я не могу войти в сообщение или сделать любую другую логи c в этом .orElseThrow утверждении.

Почему это происходит? Я видел подобный вопрос , который объясняет, что это может быть ошибкой в ​​JDK, но я хочу убедиться, что это так и есть в моей ситуации.

1 Ответ

4 голосов
/ 08 февраля 2020

Не выбросить исключение, возврат это:

.orElseThrow(() -> {
    String message = "some special failure message";
    log.error(message);
    // change “throw” to “return”:
    return new CustomInternalException(message)});

.orElseThrow() принимает Supplier<Exception>, что должен вернуть , а не throw , исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...