39

@PostConstruct文档中,它谈到了带注释的方法:

“该方法不得抛出已检查的异常。”

如何处理例如可以在这种方法中抛出的 IOException ?只需将它包装在一个 RuntimeException 中,让用户担心对象的错误初始状态?或者@PostConstruct 是验证和初始化注入其依赖项的对象的错误位置?

4

3 回答 3

48

是的,将其包装在运行时异常中。最好是更具体的东西,比如IllegalStateException.

请注意,如果 init 方法失败,通常应用程序将无法启动。

于 2012-01-05T09:40:17.117 回答
5

通常,如果您希望或期望应用程序启动失败,当您的 bean 之一抛出异常时,您可以使用 Lombok 的@SneakyThrows.

如果使用得当,它非常有用且简洁:

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

最近有一篇文章在这里讨论了它的优缺点:Prefer Lombok's @SneakyThrows to rethrowing checked exception as RuntimeExceptions

享受!

于 2018-09-11T21:17:03.407 回答
0

使用这样的软化异常,实际上包装在 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'
}
于 2018-05-21T21:28:34.383 回答