在开发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() 方法以及前面提到的“遗留方法”访问它。
Comments
comments powered by zero