有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

错误处理是否适合捕获java。多线程应用程序中的lang.ExceptionInInitializerError?

我有一个类,它在静态初始值设定项中加载和解析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
        }
    }
}

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


共 (1) 个答案

  1. # 1 楼答案

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

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

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

    我的建议是,如果您预期初始化可能会由于用户所做的某些事情而失败,那么不要在静态初始化器中进行初始化。而是显式地进行初始化;e、 g.第一次调用SingletongetInstance方法时使用惰性初始化