static变量导致的NoClassDefFoundError异常

1. 问题

NoClassDefFoundError这个异常它表示 JVM 在编译时能找到某个类,但在运行时找不到该类的定义

在我之前的博客Java类全路径冲突解决方法中,有讲到这个异常,通常是Maven包版本冲突了会出现的问题,但它也可能发生于代码存在bug导致

2. 复现

NoClassDef

如上图所示,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有问题,甚至还去找了别的团队的人。

【1】 类加载时JVM在搞什么?JVM源码分析+OOP-KLASS模型分析

posted @ 2025-05-26 19:47  songtianer  阅读(48)  评论(0)    收藏  举报