为什么Java不允许从静态初始化块抛出检查过的异常?这个设计决定背后的原因是什么?
发布于 2013-03-08 15:59:51
您可以通过捕获任何已检查的异常并将其作为未检查的异常重新引发来解决此问题。这个未检查的异常类可以很好地作为包装器使用:java.lang.ExceptionInInitializerError
。
示例代码:
protected static class _YieldCurveConfigHelperSingleton {
public static YieldCurveConfigHelper _staticInstance;
static {
try {
_staticInstance = new YieldCurveConfigHelper();
}
catch (IOException | SAXException | JAXBException e) {
throw new ExceptionInInitializerError(e);
}
}
}
发布于 2010-02-27 15:23:39
由于您编写的任何代码都不能调用静态初始化块,因此抛出检查过的exceptions
是没有用的。如果可能的话,当一个检查异常被抛出时,jvm会做什么呢?Runtimeexceptions
被向上传播。
发布于 2019-06-13 15:53:59
例如:Spring的(org.springframework.web.servlet.DispatcherServlet) DispatcherServlet处理捕获一个受控异常并抛出另一个未受控异常的场景。
static {
// Load default strategy implementations from properties file.
// This is currently strictly internal and not meant to be customized
// by application developers.
try {
ClassPathResource resource = new ClassPathResource(DEFAULT_STRATEGIES_PATH, DispatcherServlet.class);
defaultStrategies = PropertiesLoaderUtils.loadProperties(resource);
}
catch (IOException ex) {
throw new IllegalStateException("Could not load '" + DEFAULT_STRATEGIES_PATH + "': " + ex.getMessage());
}
https://stackoverflow.com/questions/2070293
复制相似问题