javac错误“代码太大”?

时间:2008-10-28 12:30:13

标签: java compiler-construction ant

我有一个单元测试,我已经静态定义了一个非常大的字节数组(超过8000字节)作为我每次运行单元测试时都不想读取的文件的字节数据。

private static final byte[] FILE_DATA = new byte[] {
12,-2,123,................
}

这在Eclipse中编译很好,但是当通过Ant脚本编译时,我得到以下错误:

[javac] C:\workspace\CCUnitTest\src\UnitTest.java:72: code too large
[javac]     private static final byte[] FILE_DATA = new byte[] {
[javac]                                 ^

任何想法为什么以及如何避免这种情况?


回答:Shimi的答案就行了。我将字节数组移到一个单独的类,它编译得很好。谢谢!

3 个答案:

答案 0 :(得分:23)

Java中的方法在字节码中限制为64k。静态初始化在单个方法中完成(参见link
您可以尝试从文件加载数组数据。

答案 1 :(得分:0)

您可以使用@BeforeClass静态方法从文件加载字节数组。这将确保它只为您的所有单元测试加载一次。

答案 2 :(得分:0)

您可以利用内部类,因为每个类都有自己的64KB限制。它可能无法帮助您使用单个大型数组,因为内部类将受到与主类相同的静态初始化程序限制。但是,你说过你设法通过将数组移动到一个单独的类来解决问题,所以我怀疑你在主类中加载的不仅仅是这个单个数组。

而不是:

private static final byte[] FILE_DATA = new byte[] {12,-2,123,...,<LARGE>};

尝试:

private static final class FILE_DATA
{
    private static final byte[] VALUES = new byte[] {12,-2,123,...,<LARGE>};
}

然后,您可以访问FILE_DATA.VALUES[i]而不是FILE_DATA[i]的值,但是您需要限制128KB而不是64KB。