我的代码中出现了一个 NoSuchFieldError,现在 oracle 不是很清楚为什么会抛出这个错误,只是说: 如果类的定义发生了不兼容的更改,这个错误只会在运行时发生。
有人可以向我解释如何“不兼容地改变”一门课吗?我正在谈论的课程扩展了相当多的课程,所以我怀疑这可能与此有关,但我不知道从哪里开始寻找或我在寻找什么。
原文由 Timotheus 发布,翻译遵循 CC BY-SA 4.0 许可协议
我的代码中出现了一个 NoSuchFieldError,现在 oracle 不是很清楚为什么会抛出这个错误,只是说: 如果类的定义发生了不兼容的更改,这个错误只会在运行时发生。
有人可以向我解释如何“不兼容地改变”一门课吗?我正在谈论的课程扩展了相当多的课程,所以我怀疑这可能与此有关,但我不知道从哪里开始寻找或我在寻找什么。
原文由 Timotheus 发布,翻译遵循 CC BY-SA 4.0 许可协议
当编译器编译抛出错误的代码时,有一些其他类有一个字段,您的类可以访问这个字段(读取或更改值)。
在运行时,另一个类不知何故没有具有此名称的字段,这导致了上述错误。
一个原因可能是第二个类在没有重新编译第一个类的情况下发生了变化。重新编译你所有的类,你应该得到一个编译器错误(这会给你更多关于如何解决这个问题的信息),或者类将引用正确的类。
另一个原因可能是您在类路径(不同版本)中的多个 jar 文件(或目录)中有一些类,导致其他一些类使用了错误的类。检查重复类上的所有罐子。
原文由 Paŭlo Ebermann 发布,翻译遵循 CC BY-SA 3.0 许可协议
8 回答6.4k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
2 回答3.2k 阅读
2 回答3.9k 阅读
1 回答2.2k 阅读✓ 已解决
3 回答1.6k 阅读✓ 已解决
如果您仅部分重新编译代码,通常会抛出此错误。您有引用重新编译的类文件中不再存在的字段的旧代码。
解决方案是清除所有类文件并重新编译所有内容。
更新: 如果在重新编译所有内容后仍然出现相同的错误,那么您可能是针对外部库的一个版本进行编译并在运行时使用另一个版本。
您现在需要做的是首先确定导致问题的类(看起来您已经这样做了),然后使用
-verbose:class
命令行选项运行您的应用程序。它会在您的标准输出中转储大量类加载信息,您将能够找出有问题的类的确切加载位置。