0

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

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

让我感到困惑的是为什么这个类在抛出 NoClassDefFoundError 之前似乎工作了一段时间。有关此异常的文档说:

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

所以我的问题是,为什么一个类可以使用一段时间,清楚地响应对其静态方法的调用,然后抛出 NoClassDefFoundError?

4

1 回答 1

1

NoClassDefFoundError它不是ClassNotFoundException。它可能在以下情况下发生:

如果 Java 虚拟机或 ClassLoader 实例尝试加载类的定义(作为正常方法调用的一部分或作为使用 new 表达式创建新实例的一部分)并且找不到类的定义,则抛出此异常。

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

为什么静态字段初始化失败导致NoClassDefFoundError?

于 2013-10-10T07:16:52.813 回答