0

我有一个类可以在静态初始化程序中加载和解析来自 XML 文件的数据,如下所示:

class A {
    //static structures to store parsed XML data
    public static int num;
    ...

    static {
        try {
            //load/parse XML data
        catch (Exception e) {
            throw new RuntimeException("...");
        }
    }

    public static void method1() {
        //do some work on data
}

此类加载的数据用于将关键数据加载到我的应用程序中:

class Important {
    ...

    public initCriticalData() {
        try {
            Class A.method();
        catch(java.lang.ExceptionInInitializerError e) {
            //notify user of failure to load/parse XMLs and wait for user to close application
        }
    }
}

建议不要捕获致命错误,但在这种情况下,捕获错误以通知用户是否合适?或者我应该在我的设计中采取不同的方向并在静态初始化程序之外加载数据?需要延迟加载数据,这就是我采用这种方法的原因。

4

1 回答 1

0

仅当您要打印错误消息然后立即终止应用程序时才适合捕获此错误。

问题是初始化失败的类将被永久卡住,初始化依赖于该类的任何其他类也是如此。每当尝试使用这些类之一时,这将导致更多异常。

解决此问题的唯一可能性是,如果所有受影响的类都通过子类加载器加载......可以放弃/替换为新的类。这在理论上是可能的,但在实践中往往是不可能的。

如果您预计初始化可能由于用户所做的某些事情而失败,我的建议是不要在静态初始化程序中进行初始化。相反,明确地进行初始化;例如,在第一次getInstance调用 Singleton 方法时使用延迟初始化。

于 2019-04-08T02:55:35.523 回答