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

当我尝试运行这个程序时,我遇到了一个奇怪的错误。 该类编译成多个.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。

关于这是如何发生或如何解决它的任何明确的想法?

根据VM Spec 4.9.1确实不允许这样做:

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

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

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

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

澄清一下:在清除所有旧的.class文件并在同一台机器上重新编译后会发生这种情况?

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

我怀疑如果你检查你的进程,你会发现你正在修改Java之外的文件。 对于由有效Java编译器生成的文件,最终没有任何理由 – 甚至是版本更改。

通过从.java文件中删除所有Line Feeds并正确地重命名它来解决问题(OpenVMS默认为所有小写,除非告知不要)

遗憾的是,我没有在各自之间进行测试,但至少它有效。

简而言之:

-Line Feeds很糟糕且名称文件正确(Java标准不是OS标准)

我在开发期间遇到了这个exception。 在我看来,Eclipse的ECJ(Eclipse Luna)引发了这种行为。 对我来说,干净的构建解决了这个问题。

我有类似的问题。 我只是试着在我的办公室PC上写一个类并转移到我们的客户端服务器来测试一些东西<因为那台机器上没有JDK。 我在两台机器上都使用了相同版本的java,但转移后我得到了Exception。 我试图在转移之前使用归档,它有所帮助。