java.lang.ClassFormatError:类文件末尾的额外字节

2022-09-04 20:46:24

当我尝试运行此程序时,我收到一个奇怪的错误。该类可以很好地编译成多个.class文件,我上周(在编辑之前)编译它很好。但现在,我看到了这个:

Exception in thread "main" java.lang.ClassFormatError: Extra bytes at the end of class file blah/hooplah/fubar/nonsense/IndexId$Transaction

根据我查找的内容,Java 6 build 1.5可以修复它,因为它允许在类文件的末尾添加额外的字节(我认为),但我宁愿使用build 1.6。

我在Windows上进行编辑,然后将.java文件FTP传输到OpenVMS机器,然后在那里编译它们。编译后,我将.class文件移动到一个目录中,该目录是通过分解上一个jar文件然后重新jar创建的。

关于这种情况是如何发生的或如何解决的,有什么明确的想法吗?


答案 1

根据 VM 规范 4.9.1,这确实是不允许的:

文件不得被截断或在末尾有额外的字节。class

如果使用的 Java 编译器和 Java 运行时不兼容,则可能会发生这种情况。验证这两个版本,并确保针对正确的运行时版本进行编译。也就是说,编译的类可以与相同或更新的运行时版本一起使用,但并不总是与较旧的运行时版本一起使用。使用 和 检查版本。java -versionjavac -version

另一个常见原因是文件在不同计算机之间的文件传输(FTP)期间损坏。此传输应在二进制模式而不是文本模式下完成。

另一个可能的原因是硬件错误,例如硬盘/文件/内存损坏。尝试重新编译或另一台计算机。


答案 2

澄清一下:这发生在您清除了所有旧的.class文件并在同一台计算机上重新编译之后?

或者,您是否在一台计算机上进行编译,然后将文件复制到另一台计算机?如果是这种情况,那么您的文件传输软件很可能正在损坏文件(Windows <-> Linux是常见的罪魁祸首,最常见的方法是添加/删除0x0D字节,但偶尔通过添加0x1A DOS EOF标记)。

我怀疑,如果你检查你的过程,你会发现你在Java之外修改文件。没有理由 - 即使是版本更改 - 由有效的Java编译器生成的文件在末尾有额外的字节。