Java “如何修复”;方法代码。。是否超过了65535字节的限制;?

Java “如何修复”;方法代码。。是否超过了65535字节的限制;?,java,compiler-errors,Java,Compiler Errors,我有以下代码: public static void main(String[] args) { try { String[] studentnames = { /* this is an array of 9000 strings... */ }; } } 我在尝试编译此文件时遇到以下错误: The code of method main(String[]) is exceeding the 65535 bytes li

我有以下代码:

public static void main(String[] args) {
    try {
        String[] studentnames = {
            /* this is an array of 9000 strings... */
        };
    }
}
我在尝试编译此文件时遇到以下错误:

The code of method main(String[]) is exceeding the 65535 bytes limit

你的方法太长了


创建不同的方法来拆分它,使它更具可读性和可维护性。

错误代码似乎不言自明

The code of method main(String[]) is exceeding the 65535 bytes limit 
这是因为Java中的方法大小有64Kb的任意硬编码限制。(实际上,许多其他内容限制在64K以内,例如方法名、常量数等。有关更多详细信息,请参阅或。)

为了解决这个问题,您所要做的就是将
main(String[]args)
方法分解为多个子方法


但是为什么不直接从文件中加载名称呢

您目前提议的方式存在以下一些问题:

  • 首先,你硬编码的细节,这几乎总是一件坏事(见)

  • 第二,你得到了错误信息;及

  • 第三,你使你的代码很难阅读

当然还有很多,但这些都是显而易见的

在java中,方法不能超过65535字节


因此,要解决此问题,请将
main(String[]args)
方法分解为多个子方法。

初始化studentnames数组将计入主方法的大小。由于共有9000个学生姓名,每个姓名只能包含约7个字符,这样您的空间就会用完。正如其他人所说,您需要减少方法的大小。正如Pramod所说,您可以将其拆分为多个部分,但在本例中,方法的大部分实际上是数据。我会按照渗透者说的做,把名字分成一个单独的文件,然后在你的主目录中读出来。像commons io这样的东西可以有效地让你达到你开始的位置

List<String> namelist = FileUtils.readLines(new File("studentnames.txt"));
String[] studentnames = namelist.toArray(new String[0]);

我会从一个文件中读学生的名字,但是一个可以使课堂变小的方法

String[] studentnames= "Student names is an array of :9000".split(" ");
与定义和使用9000个字符串不同,它只使用一个字符串。单个字符串的限制值刚刚超过20亿

方法main(字符串[])的代码超过了65535字节的限制

正如您的错误所述,main方法超出了65535字节的限制

原因:为什么代码中出现此错误?

  • 我们知道数组的内存分配是按顺序进行的。ie;如果RAM中连续存在如此巨大的可用空间,则会为阵列分配内存
  • 我们使用了字符串数组,它包含大约“9000”个字符串,这个字符串太大,无法保存在内存中
  • RAM在这段时间内可能没有这么大的空间,所以,我们可能会得到那个错误
解决方案:那么我能为此做些什么?

  • 对于存储如此大的大小值,我们可能更喜欢文件进行读/写,这样我们可以在需要时读取文件的一部分
  • 我们可以将这些字符串存储在ArrayList中,当元素被添加到ArrayList中时,ArrayList会增加其内存,而不是最初分配整个内存

只需将代码中的字符串外部化为一个*.properties/xml/json文件即可。Netbeans和/或Eclipse可以很容易地为您做到这一点。

解决方案1:

public static void main(String[] args) {
    int[] num ={100001,100002,.......,...};
}
假设数组
num
包含100000个数字,而
main
函数给出了一个错误。在这种情况下,可以将上述阵列拆分为两部分。现在,您可以声明两个不同的数组,而不仅仅是一个数组。例如:

static int[]num1={}
static int[]num2={}

在主函数外部声明
num1
,在主函数内部声明num2,其中
num2
将替换主函数内部的
num

数组的所有元素
num
将被分成两个子数组
num1
num2
;以静态和非静态数组都可以容纳8000和2000个元素的方式进行拆分

main方法中的代码可以处理所有10000个元素,这只是一个假设:

if (n <= 8000) {
    System.out.println(" --->  " + num2[((int) n - 1)]);
} else if (n > 8000 && n <= 10000) {
    n = n - 8000;
    System.out.println(" --->  " + num1[((int) n - 1)]);
}

if(n 8000&&n我为什么要从文件中加载?我所做的只是创建一个数组并打印该数组?我在读取文件时没有问题,但想知道为什么我们应该这样做…我真的不明白数组是什么。这里有几个问题:首先,你对细节进行了硬编码,这几乎总是一件坏事;其次,你得到了错误信息;第三,您使代码变得非常不可读。当然还有很多,但这些是显而易见的。
每个非本机、非抽象方法的代码量限制为65536字节,具体取决于代码属性(§4.7.3)的exception_表中的索引大小,以及LineNumberTable属性(§4.7.8)中的索引大小,并在LocalVariableTable属性中(§4.7.9).
根据java文档,它是9000还是90000?这会产生相同的错误:
静态初始值设定项的代码超过了65535字节的限制
@minipif您能解释一下原因吗,因为它不适合我。字符串不在代码块中,因此不会影响代码块的大小。我试图创建一个包含前100000个素数由空格分隔,该字符串的长度为710485。我声明它具有
私有静态final
,但出现错误
该类型生成一个字符串,该字符串需要超过65535个字节才能在常量池中以Utf8格式进行编码
。似乎不能使用字符串文字(源代码中嵌入的字符串常量)长度超过65535。因此,在这种情况下,必须从文件中读取它。@minipif正确,但这是另一个错误。如果创建一个大约4000字节的数组,则会出现代码块大小错误。使用字符串可以得到65535字节。将上述场景中的数组num分成两个不同的数组,例如int[]num={};将
if (n <= 8000) {
    System.out.println(" --->  " + num2[((int) n - 1)]);
} else if (n > 8000 && n <= 10000) {
    n = n - 8000;
    System.out.println(" --->  " + num1[((int) n - 1)]);
}