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

2022-08-31 07:57:44

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


答案 1

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

由于您无法处理已检查异常指示的任何错误,因此决定不允许抛出已检查异常静态块。

静态块不得引发选中的异常,但仍允许引发未选中的/运行时异常。但是根据上述原因,您也无法处理这些。

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


答案 2

您可以通过捕获任何已检查的异常并将其作为未选中的异常重新引发来解决此问题。这个未经检查的异常类可以很好地用作包装器:java.lang.ExceptionInitializerError

示例代码:

protected static class _YieldCurveConfigHelperSingleton {

    public static YieldCurveConfigHelper _staticInstance;

    static {
        try {
            _staticInstance = new YieldCurveConfigHelper();
        }
        catch (IOException | SAXException | JAXBException e) {
            throw new ExceptionInInitializerError(e);
        }
    }
}