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
}
}
}
建议不要捕获致命错误,但在这种情况下,捕获错误以通知用户是否合适?或者我应该在我的设计中采取不同的方向并在静态初始化程序之外加载数据?需要延迟加载数据,这就是我采用这种方法的原因。
解决方案
仅当您要打印错误消息然后立即终止应用程序时才适合捕获此错误。
问题是初始化失败的类将被永久卡住,初始化依赖于该类的任何其他类也是如此。每当尝试使用这些类之一时,这将导致更多异常。
解决此问题的唯一可能性是,如果所有受影响的类都通过子类加载器加载......可以放弃/替换为新的类。这在理论上是可能的,但在实践中往往是不可能的。
如果您预计初始化可能由于用户所做的某些事情而失败,我的建议是不要在静态初始化程序中进行初始化。相反,明确地进行初始化;例如,在第一次getInstance
调用 Singleton 方法时使用延迟初始化。
推荐阅读
- html - 如何检查任何元素是否在jQuery中有一个类?
- javascript - body.req 被拆分为多个日志
- windows - 为什么wsl2 wslconfig文件不起作用?
- java - 如何创建一种方法来生成所有可能的布尔函数?
- swift - swift中的标注按钮和firestore出现问题
- rx-java - RxJava - 在 map 和 doOnSuccess 中执行长时间运行任务的任何问题
- php - PHP | 未在数据库中加载 CSV 数据
- html - HTML的value属性如何标签工作?
- firebase - Firebase 翻译文本扩展 - 是否可以翻译嵌套集合中的字段?
- java - 我在没有“catch”、“finally”或资源声明的情况下遇到错误,我该如何在下面的代码中解决这个问题