在多线程应用中catch java.lang.ExceptionInInitializerError合适吗?

Is it appropriate to catch java.lang.ExceptionInInitializerError in multi-threaded application?

我有一个 class 可以在静态初始化程序中从 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 加载的数据用于将关键数据加载到我的应用程序中:

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
        }
    }
}

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

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

问题是初始化失败的class会永久卡住,任何other class的初始化都依赖于class。每当有人尝试使用这些 classes 之一时,这将导致更多异常。

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

如果您预计初始化可能会因用户的操作而失败,我的建议是不要在静态初始化程序中进行初始化。相反,明确地进行初始化;例如第一次调用 Singleton getInstance 方法时使用惰性初始化。