Как выбросить проверенное исключение внутри лямбда-выражения Java8?

Я пытаюсь сгенерировать исключение внутри лямбда-выражения, но оно продолжает вырабатывать сообщение об ошибке Unhandled IOException.

 private  <T> T getResponse(final RestURI query, final Class<T> responseClass) throws IOException {
        return getValue(query,
            reader -> {
                try {
                    return mapper.readValue(reader, responseClass);
                } catch (IOException e) {
                    throw new IOException("Exception while deserializing the output " + e.getMessage());
                }
        });
}

Может кто-нибудь сказать мне, что я делаю не так?

В любом случае, не создавайте повторно так: укажите e как причину нового исключения (если оно вам вообще нужно), чтобы обеспечить трассировку стека фактического исключения.

Andy Turner 24.08.2018 22:03
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
218
1

Ответы 1

Функциональный интерфейс, который вы используете в getValue(), не указывает в этой сигнатуре проверенное исключение IOException. Таким образом, вы не можете выбросить его, поскольку внутри тела лямбда могут быть выброшены только объявленные проверенные исключения. Либо создайте и используйте свой собственный функциональный интерфейс, объявляющий IOException, либо вместо этого выбросьте любой экземпляр RuntimeException из лямбда-выражения, что является допустимым. Например, UncheckedIOException, предложенный MC Emperor.

Кроме того, вы должны сгенерировать новое исключение, связав его с исключением причины, чтобы сохранить информацию в stracktrace:

try {
    return mapper.readValue(reader, responseClass);
} catch (IOException e) {
    throw new UncheckedIOException("Exception while deserializing the output ", e);
}

Или кинуть UncheckedIOException.

MC Emperor 24.08.2018 22:25

Хороший ответ, однако лучше всего, чтобы младший разработчик научился не бросать RuntimeException по умолчанию, потому что ему не хватает ясности. Вы должны расширить RuntimeException и в этом случае назвать его как-то вроде JsonParseException. @MCEmperor также предлагает элегантное решение, если вы не хотите создавать свой собственный класс. Однако предпочитайте классы, специфичные для предметной области.

Brad 24.08.2018 22:56

@Brad Полностью согласен на набор текста. Но JsonParseException уже есть в Джексоне. Фактически OP хочет повторно генерировать любое исключение, созданное ObjectMapper.readValue(), которое фактически генерирует несколько разновидностей IOException: `IOException, JsonParseException, JsonMappingException`. Так что MC Emperor, вероятно, хороший намек для этого варианта использования.

davidxxx 24.08.2018 23:09

@MC Emperor очень хороший намек.

davidxxx 24.08.2018 23:10

Другие вопросы по теме