20

我有一个单元测试,其中我静态定义了一个非常大的字节数组(超过 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 的回答成功了。我将字节数组移到一个单独的类中,它编译得很好。谢谢!

4

3 回答 3

24

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

于 2008-10-28T12:34:50.817 回答
0

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

于 2008-10-28T17:12:34.203 回答
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。

于 2014-03-25T14:14:54.633 回答