@PostConstruct & Checked exceptions

前提是你 提交于 2019-11-27 21:31:19

问题


In the @PostConstruct doc it says about the annotated methods:

"The method MUST NOT throw a checked exception."

How would one deal with e.g. an IOException which can be thrown in such a method? Just wrap it in a RuntimeException and let the user worry about the faulty initial state of the object? Or is @PostConstruct the wrong place to validate and initialize objects which got their dependencies injected?


回答1:


Yes, wrap it in a runtime exception. Preferebly something more concrete like IllegalStateException.

Note that if the init method fails, normally the application won't start.




回答2:


Generally, if you want or expect application start-up failure when one of your beans throws an exception you can use Lombok's @SneakyThrows.

It is incredibly useful and succinct when used correctly:

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

There's a recent write-up discussing its pros and cons here: Prefer Lombok’s @SneakyThrows to rethrowing checked exceptions as RuntimeExceptions

Enjoy!




回答3:


Use a softened exception like so, in effect wrapping in 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;
}

Then usage is like:

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


来源:https://stackoverflow.com/questions/8740234/postconstruct-checked-exceptions

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!