Spring框架学习(ExceptionInInitializerError异常原因与处理)
在学习Spring的过程中,为了方便后面的测试,所以在尝试集成junit。结果在此过程中报了一个ExceptionInInitializerError异常。现将该异常的出现原因与解决办法记录如下。
ExceptionInInitializerError异常
一、异常的详情
异常的意思是异常初始化错误(ExceptionInInitializerError)。而后我在网上浏览了一些对该错误的描述信息,现摘要如下:
1 2 3 4 5 6 7 8
| 当在静态初始化块中出现异常的时候,JVM会抛出java.lang.ExceptionInInitializerError异常;且任何异常都能引发这种情况,有时候在没有静态块的情况下也会抛出这种异常,因为java默认会将静态变量的初始化房子啊一个默认的静态初始化块中,然后按他们在源文件中的生命进行初始化; 在初始化失败之后,抛出此异常,dev会得到一个java.lang.NoClassDefFoundError异常,而且是在使用这个类,类加载失败的时候才会出现. 需要记住以下几点: 1. "Exception in thread "main" java.lang.ExceptionInInitializerError"意味着异常出现在主线程,并且是LinkageError的一个子类java.lang.ExceptionInInitializerError,这是JVM类加载失败时才抛出的,原因是静态初始化代码中出现了诸如IndexOutOfBoundsException或者NullPointerException这样的RuntimeException。 2. 记住JVM会将所有的静态变量的初始化按它们在源文件中的出现顺序放到一个静态初始化块中。因此,不要觉得没有看到静态初始块就认为不会出现这个异常。事实上,你得确保静态变量的正确顺序,比如说,如果 一个变量初始化的时候用到了另一个变量,你得确保这个变量在前面已经初始化过了。 3. 如果别的代码想要使用这个类,则会抛出ExceptionInInitializerError异常,而它又会导致ClassNotFoundException或者NoClassDefFoundError。为什么?因为这个类加载失败了,并没有加载到JVM的内存中。因此如果你在解决类不存在之类的异常时,先看看你的日志文件中有没有这个异常。 4. 记住静态初始化代码块会抛出RuntimeException而不是已检查异常,而后者需要有对应的catch块来进行处理。 需要谨记的是这个异常的一个副作用是NoClassDefFoundError,而Java程序抛出这个异常的位置可能会离java.lang.ExceptionInInitializerError很远,这取决于你的客户端代码何时引用到这个类。因此,在查看类路径解决NoClassDefFoundError异常之前,最好先看看日志有没有出现ExceptionInInitializerError。
|
二、该异常的出现原因
但经过排查,发现真正的异常原因如下:
是由于我在一开始导入Junit坐标的时候导入的版本是4.10版本的,而他要求Junit的版本最低是4.12或更高。在更改了junit的版本之后异常解决了。
参考资料;
Java中的ExceptionInInitializerError异常及解决方法