代码之家  ›  专栏  ›  技术社区  ›  Epaga Alex Reynolds

javac错误“代码太大”?

  •  19
  • Epaga Alex Reynolds  · 技术社区  · 16 年前

    我有一个单元测试,在这里我静态地定义了一个相当大的字节数组(超过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]                                 ^
    

    我有什么办法可以避免这个吗?


    回答 希米的回答成功了。我把字节数组移到一个单独的类中,它编译得很好。谢谢!

    3 回复  |  直到 11 年前
        1
  •  23
  •   Shimi Bandiel    16 年前

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

        2
  •  0
  •   Cem Catikkas    16 年前

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

        3
  •  0
  •   Josh    11 年前

    您可以利用内部类,因为每个类都有自己的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。