错误处理是否适合捕获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 楼答案
只有当您要打印错误消息,然后立即终止应用程序时,才适合捕获此错误
问题是初始化失败的类将被永久卡住,初始化依赖于该类的任何其他类也是如此。每当有东西试图使用其中一个类时,这将导致更多的异常
修复此问题的唯一可能性是,如果所有受影响的类都通过子类加载器加载。。。可以放弃/替换为新的。这在理论上是可能的,但在实践中往往是不可能的
我的建议是,如果您预期初始化可能会由于用户所做的某些事情而失败,那么不要在静态初始化器中进行初始化。而是显式地进行初始化;e、 g.第一次调用Singleton
getInstance
方法时使用惰性初始化