static变量导致的NoClassDefFoundError异常
1. 问题
NoClassDefFoundError这个异常它表示 JVM 在编译时能找到某个类,但在运行时找不到该类的定义
在我之前的博客Java类全路径冲突解决方法中,有讲到这个异常,通常是Maven包版本冲突了会出现的问题,但它也可能发生于代码存在bug导致
2. 复现

如上图所示,static变量在初始化报错导致类无法加载
第一次使用报ExceptionInInitializerError错
第二次使用报.NoClassDefFoundError: Could not initialize class
3. 分析
分析一下, 为什么包ExceptionInInitializerError,因为初始化static变量的时候报错了,在类加载的过程中,准备阶段会给static变量赋值,这一块报错导致整个类加载也错误了,在第二次使用的时候,JVM发现这个类无法加载成功,只能返回NoClassDefFoundError

下面是JVM类链接的源代码
bool InstanceKlass::link_class_impl(
instanceKlassHandle this_oop, bool throw_verifyerror, TRAPS) {
// check for error state
if (this_oop->is_in_error_state()) {
ResourceMark rm(THREAD);
// 检查是错误状态直接抛NoClassDefFoundError
THROW_MSG_(vmSymbols::java_lang_NoClassDefFoundError(),
this_oop->external_name(), false);
}
所以大家查看日志的时候还是要从前面的错看起,我是因为忽略了第一个错,导致我认为一直以为是maven引入的jar有问题,甚至还去找了别的团队的人。
本文来自博客园,作者:songtianer,转载请注明原文链接:https://www.cnblogs.com/songjiyang/p/18897361

浙公网安备 33010602011771号