如何修复"The code of method .. is exceeding the 65535 bytes limit"?



我有以下代码:

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

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

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

错误代码似乎很容易解释。

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

这是因为在Java中,方法大小有64Kb的任意硬编码限制。(实际上,许多其他东西都限制在64K以内,比如方法名称、常量数量等。有关更多详细信息,请参阅Java 8规范或Java 7规范。)

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


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

按照你目前提议的方式做这件事的一些问题是:

  • 首先,你很难对细节进行编码,这几乎总是一件坏事(见此);

  • 其次,您收到了错误消息;和

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

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

初始化studentname数组是按主方法的大小计算的。由于有9000个学生的名字,每个名字只能有大约7个字符,否则你就会耗尽空间。正如其他人所说,你需要缩小方法的规模。正如Pramod所说,你可以将其分割成多个部分,但在这种情况下,大部分方法实际上是数据。我会按照Infiltator的说法,把名字分成一个单独的文件,然后在你的主页上阅读。像commons io这样的东西可以用来让你有效地到达你开始的位置

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

您可能会发现处理列表而不是将其转换为数组很有用,或者您可以使用LineIterator代替

LineIterator it = FileUtils.lineIterator(file);
try {
     while (it.hasNext()) {
         String line = it.nextLine();
         // do something with line
     }
 } finally {
     it.close();
 }

我会从一个文件中读取学生的名字,但有一个方法可以解决这个问题,这也会使班级变得更小

String[] studentnames= "Student names is an array of :9000".split(" ");

这只使用了一个字符串,而不是定义和使用9000个字符串。单个字符串的限制仅超过20亿。

您的方法太长。

创建不同的方法对其进行拆分,使其可读性和可维护性更强。

解决方案编号1:

public static void main(String[] args) {
    int[] num ={100001,100002,.......,...};
}

假设数组num包含100000个数字,而您的main函数会给出一个错误。在这种情况下,您可以将上述数组拆分为两部分。现在,您可以声明两个不同的数组,而不是仅声明一个数组。例如:

CCD_ 5和CCD_ 6

在主函数外声明num1,在主函数内声明num2,其中num2将取代主函数内的num

阵列CCD_ 10的所有元素将被分割成两个子阵列num1num2;以这样一种方式划分,即静态和非静态阵列都可以容纳8000和2000个元素。

主方法中的代码可以处理所有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)]);
}

因此,将数组拆分,或者说将元素分为8000和2000两部分,可以消除错误。

解决方案编号2

将数组置于main方法之外,num1num2现在都是静态数组,但65535字节的限制也适用于静态初始化的数组。拆分您的元素,例如,您可以在8000和2000中拆分10000,也可以根据您的要求在主方法之外的两个静态数组中拆分。

此错误与long[]int[]中元素的存储有关,如果存储大小超过65535的限制,则会发生错误。在这种情况下,请拆分元素,例如,如果您使用long[]int[],请将它们拆分为适当的数量,直到错误得到解决。

换句话说,不是必须只将数组拆分为2个部分,您也可以将它们拆分为4个不同的大小或不同的相等部分。但是,你的问题的解决方案可能会根据你的要求而有所不同。

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

正如您的错误所说,主方法超过了65535字节的限制。

原因:为什么我们的代码中出现此错误

  • 我们知道数组的内存分配将按顺序进行。即;如果RAM中连续存在如此巨大的可用空间,则将为阵列分配存储器
  • 我们使用了字符串数组,它包含一些"9000"个字符串,这个字符串太大了,无法保存在内存中
  • 在那段时间里,RAM可能不会连续有这么大的空间,所以,我们可能会出现这个错误

解决方案:那么我能为此做些什么呢

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

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

相关内容

最新更新