Java中的“代码太大”编译错误

时间:2010-03-09 09:33:17

标签: java arrays compiler-errors code-size

Java中的代码是否有任何最大大小?我写了一个超过10,000行的函数。实际上,每一行都为数组变量赋值。

arts_bag[10792]="newyorkartworld";
arts_bag[10793]="leningradschool";
arts_bag[10794]="mailart";
arts_bag[10795]="artspan";
arts_bag[10796]="watercolor";
arts_bag[10797]="sculptures";
arts_bag[10798]="stonesculpture"; 

在编译时,我收到此错误:代码太大

我如何克服这个问题?

14 个答案:

答案 0 :(得分:81)

  

Java类中的单个方法最多可以是64KB的字节码。

但是你应该清理它!

使用.properties文件存储此数据,并通过java.util.Properties

加载

您可以将.properties文件放在类路径上,然后使用:

Properties properties = new Properties();
InputStream inputStream = getClass().getResourceAsStream("yourfile.properties");
properties.load(inputStream);

答案 1 :(得分:12)

method

上有64K字节代码大小限制

话虽如此,我必须同意理查德;为什么你需要一个大的方法?给定OP中的示例,属性文件应该足够......或者甚至是数据库(如果需要)。

答案 2 :(得分:10)

根据Java Virtual Machine specificationthe code of a method must not be bigger than 65536 bytes

  

code_length项的值必须小于65536。

§4.7.3 The Code Attribute中定义了code_length

  

code_lengthcode_length项的值给出了此方法的代码数组中的字节数。 code_length的值必须大于零;代码数组不能为空。

     

code[]:代码数组给出了实现该方法的Java虚拟机代码的实际字节数。

答案 3 :(得分:9)

这看起来有点疯狂。您是否可以通过读取文本文件或其他数据源中的值来初始化数组?

答案 4 :(得分:3)

尝试重构您的代码。 Java中的方法大小有限制。

答案 5 :(得分:2)

正如其他答案中所提到的,方法有一个64KB的字节码限制(至少在Sun的java编译器中)

对我而言,将该方法分解为更多方法会更有意义 - 每个方法都将某些相关的东西分配给数组(使用ArrayList执行此操作可能更有意义)

例如:

public void addArrayItems()
{
  addSculptureItems(list);
  ...
}

public void addSculptureItems(ArrayList list)
{
  list.add("sculptures");
  list.add("stonesculpture");
}

或者,您可以从静态资源加载项目(如果它们是从属性文件

中修复的话)

答案 6 :(得分:1)

我自己遇到过这个问题。对我有用的解决方案是将方法重构并缩小为更易于管理的部分。和你一样,我正在处理近10K的线路方法。但是,通过使用静态变量以及较小的模块化函数,问题得以解决。

似乎会有更好的解决方法,但使用Java 8,没有...

答案 7 :(得分:1)

您可以添加另一种方法来为您的代码创建额外数据空间的空间,您可能有一个占用大量数据空间的方法。尝试划分你的方法,因为我遇到了同样的问题,并通过在我的java Android代码中为相同的数据创建另一个额外的方法来修复它。问题在我做完之后就消失了。

答案 8 :(得分:1)

我来到这个问题是因为我试图解决一个类似的问题。出于性能原因,我想将一个包含 1600 个元素的图形硬编码到一个 2D 整数数组中。我在 leetcode 风格的网站上解决了一个问题,从文件中加载图形数据不是一种选择。整个图表超过了 64K 的最大值,因此我无法进行一次静态分配。我将分配拆分到几个静态方法中,每个方法都低于限制,然后一个一个地调用每个方法。

private static int[][] G = new int[1601][];

static {
    assignFirst250();
    assignSecond250();
    assignSecond500();
    assignThird500();
}

private static void assignFirst250() {
    G[1] = new int[]{3,8,15,24,35,48,63,80,99,120,143,168,195,224,255,288,323,360,399,440,483,528,575,624,675,728,783,840,899,960,1023,1088,1155,1224,1295,1368,1443,1520,1599};
    G[2] = new int[]{2,7,14,23,34,47,62,79,98,119,142,167,194,223,254,287,322,359,398,439,482,527,574,623,674,727,782,839,898,959,1022,1087,1154,1223,1294,1367,1442,1519,1598};

答案 9 :(得分:0)

由于单个函数中的代码太大,有时会发生此错误... 要解决该错误,请在多个函数中拆分该函数,例如

//Too large code function
private void mySingleFunction(){
.
.
2000 lines of code
}
//To solve the problem
private void mySingleFunction_1(){
.
.
500 lines of code
}
private void mySingleFunction_2(){
.
.
500 lines of code
}
private void mySingleFunction_3(){
.
.
500 lines of code
}
private void mySingleFunction_4(){
.
.
500 lines of code
}
private void MySingleFunction(){
mySingleFunction_1();
mySingleFunction_2();
mySingleFunction_3();
mySingleFunction_4();
}

答案 10 :(得分:0)

我有一个枚举,该枚举导致.java文件的大小超过500KB。 Eclipse可以出于某种原因来构建它。 eclipse导出的ant build.xml不能。我正在调查此事,并将更新这篇文章。

答案 11 :(得分:0)

由于方法有大小限制,并且您现在不希望重新设计代码,因此可以将数组分成4-5个部分,然后将它们放入不同的方法中。在读取数组时,请依次调用所有方法。您也可以维护一个计数器,以了解已解析了多少个索引。

答案 12 :(得分:0)

这是由于单个方法中的所有代码 解决方案:创建更多的小方法,该错误将消失

答案 13 :(得分:0)

好的,也许这个答案为时已晚,但是我认为这种方法比另一种方法好

例如,我们在代码中有1000行数据

  1. 打破他们

    private void rows500() {
         //you shoud write 1-500 rows here
    }
    
    private void rows1000() {
         you shoud write 500-1000 rows here
    }
    
  2. 为了获得更好的性能,请在代码中添加“ if”

    if (count < 500) {
        rows500();
    } else if (count > 500) {
        rows1000();
    }
    

我希望这段代码对您有帮助