32

我有以下代码:

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
4

8 回答 8

33

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

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

于 2012-09-04T05:52:41.930 回答
14

错误代码似乎不言自明。

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

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

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


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

按照您目前建议的方式进行操作的一些问题是:

  • 首先,您对细节进行了硬编码,这几乎总是一件坏事(请参阅this);

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

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

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

于 2012-09-04T05:44:46.917 回答
3

初始化 studentnames 数组将计入 main 方法的大小。由于有 9000 个学生姓名,每个姓名只能包含大约 7 个字符,否则空间不足。正如其他人所说,您需要减小方法的大小。正如 Pramod 所说,您可以将其拆分为多个部分,但在这种情况下,该方法的大部分实际上是数据。我会按照 Infiltrator 的说法将名称拆分到一个单独的文件中,然后在您的主文件中读取它。像 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();
 }
于 2012-09-04T06:33:09.607 回答
1

你的方法太长了。

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

于 2012-09-04T05:43:53.267 回答
1

我会从文件中读取学生的姓名,但是可以解决一个问题,这也会使班级变小

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

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

于 2012-09-04T07:07:54.650 回答
1

解决方案一:

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

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

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

在 main 函数外部声明num1,在 main 函数内部声明 num2num2将在 main 函数内部替换num

数组的所有元素num将被分成两个子数组num1num2;以这样一种方式拆分,即静态和非静态数组都可以容纳 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)]);
}

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

解决方案2

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

如果存储大小超过 65535 的限制,则此错误与元素的存储long[]int[]发生错误的位置有关。在这种情况下,请拆分元素,例如,如果您正在使用long[]int[]以合适的数量拆分它们,直到出现错误解决。

换句话说,不强制只将数组分成 2 部分,您也可以将它们分成 4 种不同的大小或不同的相等部分。但同样,您的问题的解决方案可能会根据您的要求而有所不同。

于 2019-06-17T08:46:52.267 回答
0

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

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

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

  • 我们知道数组的内存分配将按顺序完成。IE; 如果 RAM 中连续有如此大量的可用空间,则将为数组分配内存。
  • 我们使用了包含一些“9000”字符串的字符串数组——它太大而无法保存在内存中
  • 在这段时间里,RAM 可能不会连续有这么大的空间,所以我们可能会遇到这个错误。

解决方案:那么我该怎么做呢?

  • 为了存储如此巨大的大小值,我们可能更喜欢文件进行读/写 - 所以我们可以在需要时读取文件的一部分
  • 我们可以将这些字符串存储在 ArrayList 中,当元素添加到其中时,它会增加内存,而不是最初分配整个内存。
于 2016-12-06T16:31:25.900 回答
0

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

于 2017-11-22T18:59:27.067 回答