NoSuchFieldError Java

Tim*_*eus 40 java debugging

我在我的代码中得到一个NoSuchFieldError,现在oracle不清楚为什么抛出这个错误只说:这个错误只能在运行时发生,如果类的定义有不兼容的改变.

有人可以向我解释一个人如何"不相容地改变"一个班级?我正在谈论的课程扩展了相当多的课程,所以我怀疑它可能与此有关,但我不知道从哪里开始寻找或者我正在寻找什么.

biz*_*lop 64

如果您只是部分重新编译代码,则通常会抛出此错误.您有旧的代码引用了重新编译的类文件中不再存在的字段.

解决方案是清除所有类文件并从新鲜编译所有内容.

更新:如果在重新编译所有内容后仍然遇到相同的错误,那么您可能正在编译外部库的一个版本并在运行时使用另一个版本.

您现在需要做的是首先确定导致问题的类(看起来您已经这样做了),然后使用-verbose:class命令行选项运行您的应用程序.它将在您的标准输出上转储大量的类加载信息,您将能够找到有问题的类的确切加载位置.


Paŭ*_*ann 7

当编译器编译抛出错误的代码时,有一些其他类具有字段,并且您的类可以访问此字段(读取或更改值).

在运行时,另一个类以某种方式没有具有此名称的字段,这导致提到的错误.

一个原因可能是第二个类在没有重新编译第一个类的情况下发生了变化.重新编译所有类,您应该得到一个编译器错误(这将为您提供有关如何解决此问题的更多信息),或者该类将引用正确的类.

另一个原因可能是您在类路径(不同版本)中的多个jar文件(或目录)中有一些类,导致其他一些类使用错误的类.检查所有重复课程的罐子.


小智 5

在 IDE(在我的例子中是 Eclipse)中跟踪这些错误时需要注意的是观察您的项目可能依赖的项目的依赖关系。如果在不同的依赖项目中使用不同版本的库,类路径加载器可能会选择错误的。这包括让一个项目依赖于从 Eclipse 项目创建的 jar,以及让另一个项目依赖于该项目和生成 jar 的项目。可能会加载 jar 中过时的类,而不是项目中的类。

例子:

project1取决于project2project3

project3取决于project2.jar,从类文件生成的 jarproject2

在 中的类中添加了最终静态字段,该类project2会重新编译,而project2.jar不会重新构建

运行project1可能会导致异常,因为project2来自项目的类可能直接从项目或没有该字段的 jar 加载