【问题标题】:javac error "code too large"?javac错误“代码太大”?
【发布时间】:2008-10-28 12:30:13
【问题描述】:

我有一个单元测试,其中我静态定义了一个非常大的字节数组(超过 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]                                 ^

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


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

【问题讨论】:

  • 那么为什么它在 Eclipse 中可以工作??
  • 我知道 Eclipse 使用的编译器与 Javac 不同。也许这可以解释它。
  • 啊,是的,我忘记了。我在 JDK 之前安装了 Eclipse 一次,却发现它已编译——那时我发现它内置了自己的编译器。
  • 我刚刚解决了这个问题,将我的数据初始化拆分为 120 种不同的静态方法。
  • @paxdiablo Eclipse 使用 ECJ

标签: java compiler-construction ant


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2015-03-28
        • 1970-01-01
        • 2016-03-23
        • 2014-09-13
        • 1970-01-01
        • 1970-01-01
        • 2011-01-25
        • 2016-01-09
        • 1970-01-01
        相关资源
        最近更新 更多