在加载/使用类之后可以抛出NoClassDefFoundError吗?

时间:2013-10-10 07:06:44

标签: java web-applications noclassdeffounderror

上下文是这样的:我有一个包含所有静态方法的类和一个静态初始化块。此类是Web应用程序的一部分,该应用程序打包为战争并部署在WebSphere 10中。

在某些情况下,war中的其他类会尝试在此类上调用方法,但只能获取NoClassDefFoundError。我觉得奇怪的是,我可以从日志中看到类的方法已经多次被成功调用,但突然之间,一个相同的(以前成功的)方法调用将会生成一个NoClassDefFoundError。此时,对类的静态方法的任何未来调用都将生成该错误(直到重新启动WebSpehere容器或重新部署war)。

让我感到困惑的是为什么这个类在抛出NoClassDefFoundError之前似乎工作了一段时间。此例外的documentation表示:

在编译当前正在执行的类时存在搜索的类定义,但无法再找到该定义。

所以我的问题是,一个类如何可用一段时间,明确响应对其静态方法的调用然后抛出NoClassDefFoundError?

1 个答案:

答案 0 :(得分:1)

NoClassDefFoundError不是ClassNotFoundException。它可能发生在:

  

如果Java虚拟机或ClassLoader实例尝试,则抛出该异常   加载类的定义(作为普通方法调用的一部分或   作为使用新表达式创建新实例的一部分)和否   可以找到班级的定义。

我的经验表明,如果静态初始化程序块中存在异常,也可以抛出此异常。

Why NoClassDefFoundError caused by static field initialization failure?