java - 在多线程应用程序中捕获 java.lang.ExceptionInInitializerError 是否合适?

标签 java error-handling static-initializer

我有一个类可以在静态初始化程序中加载和解析来自 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
        }
    }
}

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

最佳答案

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

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

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

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

关于java - 在多线程应用程序中捕获 java.lang.ExceptionInInitializerError 是否合适?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55565502/

相关文章:

java - 使用 Jackson 解析 geojson

java - Android Firebase数据库自动刷新更新2

node.js - ExpressJS框架(nodejs)仅将堆栈错误记录到文件

c++ - 具有类成员的结构的静态初始化

java - 使用 bash globing 设置 Java 命令行属性

java - 比较列表 WebElement 与字符串数组

java - 专业程序员使用哪种风格,使用 try 和 catch 还是在代码中添加错误处理?

php - 如何处理Jquery.ajax触发的php脚本中的错误?

java - 再次调用静态初始化器

c++ - 内置类型的对象是否具有特殊的静态初始化顺序优先级?