为什么 Java 不允许从静态初始化块中抛出检查异常?这个设计决定背后的原因是什么?
原文由 missingfaktor 发布,翻译遵循 CC BY-SA 4.0 许可协议
为什么 Java 不允许从静态初始化块中抛出检查异常?这个设计决定背后的原因是什么?
原文由 missingfaktor 发布,翻译遵循 CC BY-SA 4.0 许可协议
您可以通过捕获任何已检查的异常并将其作为未检查的异常重新抛出来解决该问题。这个未经检查的异常类作为包装器工作得很好: 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);
}
}
}
原文由 kevinarpe 发布,翻译遵循 CC BY-SA 3.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
因为不可能在你的源代码中处理这些检查过的异常。您无法控制初始化过程,并且无法从您的源调用静态{}块,因此您可以用 try-catch 包围它们。
因为您无法处理已检查异常指示的任何错误,所以决定禁止抛出已检查异常静态块。
静态块不得抛出已 检查 异常,但仍允许抛出未检查/运行时异常。但根据上述原因,你也无法处理这些。
总而言之,此限制可防止(或至少使其更难)开发人员构建可能导致应用程序无法从中恢复的错误的内容。