访问排行榜
谷歌广告
谷歌广告
java.lang.ExceptionInInitializerError异常分析
Author zero | Posted 2019-11-30 15:05:00

在开发Android项目的时候偶然发现了这样一个Exception,Exception栈指向的位置也很莫名,属于绝对不会有问题的地方:单例模式的getInstance方法,首先个人喜欢使用懒汉模式进行创建单例,就是直接在成员变量进行初始化,如下所示:

private final static AccountService accountService = new AccountService();

private AccountDao accountDao;

private AccountService() {
    accountDao = new AccountDao();
}

public static AccountService getInstance() {
    return accountService;
}

从代码来看,一行冷汗,完全一筹莫展,但是呢,大胆分析一下又基本八九不离十,首先问题定位,肯定是静态对象的创建过程中出现了问题,那么直接定位构造函数即可,从new AccountDao不难看出,问题不出意外就在这里,然后本人鬼使神差的把错误日志往上翻看了几页,不出意料就看到了又一个完全不一样的Exception栈,且就定位在new AccountDao。还是个人习惯不太好,总是从倒数第一个异常看问题从而忽略了这个原始异常的日志。

解决问题的历程结束,但是要解释这个问题还得从Java的静态设计来说,我就直接copy一段了:

静态初始化程序中发生意外异常的信号。抛出 ExceptionInInitializerError 表明在计算静态初始值或静态变量的初始值期间发生异常。

从版本 1.4 开始,这个异常已经更新过,符合通用异常链机制。“保存的 throwable 对象”可能是在构造的时候提供的,并且可以通过 getException() 方法来访问,这类对象目前被认为是导致异常的原因,可以通过 Throwable.getCause() 方法以及前面提到的“遗留方法”访问它。

Android+GoLang+SprintBoot探讨群:186305789(疯狂的程序员),绝影大神在等你

个人兴趣网站:zero接码平台

个人兴趣网站:猿指


Comments

comments powered by zero