java.lang.ExceptionInInitializerError原因及解决办法
java.lang.Object | ||||
---|---|---|---|---|
↳ | java.lang.Throwable | |||
↳ | java.lang.Error | |||
↳ | java.lang.LinkageError | |||
↳ | java.lang.ExceptionInInitializerError |
ExceptionInInitializerError
通常意味着在静态初始化块或静态变量初始化过程中发生了异常。
静态代码块异常:如果在静态代码块中有任何异常抛出,都会导致此错误。
1 |
|
静态变量初始化异常:如果静态变量在初始化时抛出了异常,也会导致此错误。(编译后实际上也是在静态代码块里面)
1 |
|
解决方法
一般来说,查看堆栈跟踪都能找出问题所在。
- 检查静态初始化块:确保静态初始化块中没有抛出异常的代码。
- 检查静态变量初始化:确保所有静态变量的初始化都是安全的,没有抛出异常。
工作中的例子
1 |
|
查看654行代码,引用了一个静态类。
1 |
|
以上代码咋一看好像也没什么问题啊,异常都catch住了。
但如果仔细研究就会发现,这里的问题是滥用了Exception
,没有针对具体异常进行捕获。查看loadLibrary源码发现其可能会抛出SecurityException
、UnsatisfiedLinkError
或者NullPointerException
,SecurityException
和NullPointerException
的父类都是RuntimeException
,是一种异常(Exception
),UnsatisfiedLinkError
的父类是LinkageError
,是一种错误(Error
),所以如果这里发生了UnsatisfiedLinkError
,通过Exception
是捕获不了的,必须通过他们的共同父类Throwable
来进行捕获。当然,最好还是针对具体的异常进行捕获,不要用这种扩大化的捕获方式,容易隐藏问题。
1 |
|
参考
ExceptionInInitializerError | Android Developers
When Does Java Throw the ExceptionInInitializerError? | Baeldung
java.lang.ExceptionInInitializerError原因及解决办法
https://iwesley.top/article/78c113a2/