@PostConstruct & Проверенные исключения - PullRequest
32 голосов
/ 05 января 2012

В документе @ PostConstruct говорится о аннотированных методах:

"Метод НЕ ДОЛЖЕН вызывать проверенное исключение."

Как можно поступить, например, с IOException, который может быть сгенерирован таким способом?Просто оберните его в RuntimeException и позвольте пользователю беспокоиться о неправильном начальном состоянии объекта?Или @PostConstruct не в том месте, чтобы проверять и инициализировать объекты, в которые были введены зависимости?

Ответы [ 3 ]

40 голосов
/ 05 января 2012

Да, обернуть его в исключение времени выполнения. Предпочтительно что-то более конкретное, например IllegalStateException.

Обратите внимание, что в случае сбоя метода init приложение обычно не запускается.

2 голосов
/ 12 сентября 2018

Как правило, если вы хотите или ожидаете сбоя при запуске приложения, когда один из ваших компонентов выдает исключение, вы можете использовать @SneakyThrows.

Lombok. Это невероятно полезно и лаконично, когдаиспользуется правильно:

@SneakyThrows
@PostConstruct
public void init() {
    // I usually throw a checked exception
}

Недавно была опубликована статья, в которой обсуждаются ее плюсы и минусы: Предпочитайте @SneakyThrows Ломбока перебрасывать проверенные исключения как RuntimeExceptions

Наслаждайтесь!

0 голосов
/ 22 мая 2018

Используйте смягченное исключение, как, например, для переноса в RuntimeException: https://repl.it/@djangofan/SoftenExceptionjava

private static RuntimeException softenException(Exception e) {
    return checkednessRemover(e);
}
private static <T extends Exception> T checkednessRemover(Exception e) throws T {
    throw (T) e;
}

Тогда использование выглядит так:

} catch (IOException e) {
        throw softenException(e);
        //throw e; // this would require declaring 'throws IOException'
}
...