如何修复“方法代码..超过65535字节限制”?

我有以下代码:

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)方法分解为多个子方法。


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

以您目前提出的方式执行此操作的一些问题包括:

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

  • 其次,你收到了错误信息; 和

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

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

初始化studentnames数组正在计算main方法的大小。 由于有9000个学生姓名,每个名称在空间用完之前只能是大约7个字符。 正如其他人所说,你需要减少方法的大小。 您可以像Pramod所说的那样将它拆分成碎片,但在这种情况下,该方法的大部分实际上是数据。 我会这样做,因为Infiltrator说并将名称拆分成一个单独的文件,只需在你的主文件中阅读。 像commons-io这样的东西可以用来让你有效地获得你正在开始的相同位置。

 List 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亿。

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

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

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

  • 我们知道数组的内存分配是按顺序完成的。 即; 如果在RAM中连续可用的大量空间,则将为该arrays分配存储器。
  • 我们使用了String数组,其中包含一些“9000”字符串 – 这些字符串太大而无法容纳在内存中
  • 在此期间,RAM可能不会有如此大的空间,所以我们可能会遇到这个错误。

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

  • 为了存储如此巨大的值,我们可能更喜欢文件进行读/写 – 因此我们可以在需要时读取文件的一部分
  • 我们可以将这些字符串存储在ArrayList中,当元素添加到它时,它会增加内存,而不是最初在整体上分配内存。

你的方法太长了。

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

只需将代码中的字符串外部化为一个* .properties / xml / json文件即可。 Netbeans和/或Eclipse可以轻松地为您完成。