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

时间:2010-06-15 13:11:56

标签: java exception

当我尝试运行此程序时,我遇到了一个奇怪的错误。该类编译成多个.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可以修复它,因为它允许类文件末尾的额外字节(我认为),但我宁愿使用构建1.6。

我正在Windows上编辑,然后将.java文件FTP到OpenVMS机器上,然后编译它们。在编译之后,我将.class文件移动到一个目录中,该目录是通过爆炸前一个jar文件然后重新jar来创建的。

有关如何发生这种情况或如何解决问题的明确想法?

6 个答案:

答案 0 :(得分:7)

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

  

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

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

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

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:2)

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

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

简而言之:

-Line Feeds不好 AND 正确命名文件(Java标准不是操作系统标准)

答案 3 :(得分:2)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

尝试

İntellij的想法->设置->构建执行,部署->设置-> 编译器-Java编译器->默认为Eclipse,将其更改为Javac(使用编译器)

构建工具-> Maven->导入并取消选中“自动检测编译器”。

祝你好运。