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