上下文是这样的:我有一个包含所有静态方法的类和一个静态初始化块。此类是Web应用程序的一部分,该应用程序打包为战争并部署在WebSphere 10中。
在某些情况下,war中的其他类会尝试在此类上调用方法,但只能获取NoClassDefFoundError。我觉得奇怪的是,我可以从日志中看到类的方法已经多次被成功调用,但突然之间,一个相同的(以前成功的)方法调用将会生成一个NoClassDefFoundError。此时,对类的静态方法的任何未来调用都将生成该错误(直到重新启动WebSpehere容器或重新部署war)。
让我感到困惑的是为什么这个类在抛出NoClassDefFoundError之前似乎工作了一段时间。此例外的documentation表示:
在编译当前正在执行的类时存在搜索的类定义,但无法再找到该定义。
所以我的问题是,一个类如何可用一段时间,明确响应对其静态方法的调用然后抛出NoClassDefFoundError?
答案 0 :(得分:1)
NoClassDefFoundError
不是ClassNotFoundException
。它可能发生在:
如果Java虚拟机或ClassLoader实例尝试,则抛出该异常 加载类的定义(作为普通方法调用的一部分或 作为使用新表达式创建新实例的一部分)和否 可以找到班级的定义。
我的经验表明,如果静态初始化程序块中存在异常,也可以抛出此异常。
Why NoClassDefFoundError caused by static field initialization failure?