103

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"; 

在编译时,我得到这个错误:代码太大

我该如何克服呢?

4

14 回答 14

102

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

但是你应该把它清理干净!

使用.properties文件存储这些数据,并通过加载它java.util.Properties

您可以通过将.properties文件放在类路径中来做到这一点,并使用:

Properties properties = new Properties();
InputStream inputStream = getClass().getResourceAsStream("yourfile.properties");
properties.load(inputStream);
于 2010-03-09T09:35:50.340 回答
19

方法有 64K 字节码大小限制

话虽如此,我不得不同意理查德。为什么需要这么大的方法?给定 OP 中的示例,一个属性文件就足够了……如果需要,甚至是一个数据库。

于 2010-03-09T09:36:32.753 回答
16

根据Java 虚拟机规范方法的代码不得大于 65536 字节

该项目的值给出了此方法的数组code_length中的字节数。code

code_length 的值必须大于零(因为代码数组不能为空)且小于 65536。

code_length定义code[]包含方法的实际字节码的属性的大小:

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

于 2010-03-09T09:47:59.860 回答
7

这似乎有点疯狂。您不能通过从文本文件或其他数据源中读取值来初始化数组吗?

于 2010-03-09T09:35:16.393 回答
6

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

//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();
}
于 2017-07-23T05:54:19.487 回答
2

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

于 2010-03-09T09:39:49.533 回答
2

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

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

例如:

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

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

或者,如果它们像从属性文件中一样被固定,您可以从静态资源加载项目

于 2010-03-09T09:44:37.427 回答
2

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

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

于 2014-09-26T23:31:05.733 回答
1

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

于 2015-12-23T11:05:24.127 回答
1

我来这个问题是因为我试图解决类似的问题。出于性能原因,我想将具有 1600 个元素的图形硬编码到二维整数数组中。我在一个 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};
于 2021-01-28T23:47:38.003 回答
0

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

于 2019-11-29T19:50:33.313 回答
0

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

于 2019-11-29T20:08:26.750 回答
0

这是由于单一方法解决方案中的所有代码:创建更多一些小方法然后此错误将消失

于 2020-02-13T22:47:32.297 回答
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 (count < 500) {
        rows500();
    } else if (count > 500) {
        rows1000();
    }
    

我希望这段代码可以帮助你

于 2020-04-15T08:31:52.640 回答