为什么 Java 不允许从静态初始化块中抛出检查异常?

新手上路,请多包涵

为什么 Java 不允许从静态初始化块中抛出检查异常?这个设计决定背后的原因是什么?

原文由 missingfaktor 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 788
2 个回答

因为不可能在你的源代码中处理这些检查过的异常。您无法控制初始化过程,并且无法从您的源调用静态{}块,因此您可以用 try-catch 包围它们。

因为您无法处理已检查异常指示的任何错误,所以决定禁止抛出已检查异常静态块。

静态块不得抛出已 检查 异常,但仍允许抛出未检查/运行时异常。但根据上述原因,你也无法处理这些。

总而言之,此限制可防止(或至少使其更难)开发人员构建可能导致应用程序无法从中恢复的错误的内容。

原文由 Kosi2801 发布,翻译遵循 CC BY-SA 3.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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题