我有以下代码:
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
答案 0 :(得分:23)
在java中,方法不能超过65535个字节。
因此,要解决此问题,请将main(String[] args)
方法分解为多个子方法。
答案 1 :(得分:11)
错误代码似乎很明显。
The code of method main(String[]) is exceeding the 65535 bytes limit
这是因为对于方法大小,Java中有64Kb的任意硬编码限制。 (实际上许多其他事情仅限于64K,例如方法名称,常量数量等。有关详细信息,请参阅Java 8 specs或Java 7 specs。)
要解决此问题,您所要做的就是将main(String[] args)
方法分解为多个子方法。
但为什么不直接从文件加载名称?
以您目前提议的方式执行此操作的一些问题包括:
首先,你是硬编码的细节,这几乎总是一件坏事(见this);
其次,你收到了这条错误信息;以及
第三,你的代码很难阅读。
当然还有更多,但这些是显而易见的。
答案 2 :(得分:2)
初始化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();
}
答案 3 :(得分:1)
我会从一个文件中读取学生的姓名,但是一个可以使课程变小的工作
String[] studentnames= "Student names is an array of :9000".split(" ");
而不是定义和使用9000个字符串,而只使用一个。单个字符串的限制刚刚超过20亿。
答案 4 :(得分:1)
方法main(String [])的代码超过65535字节限制
正如您的错误所说,main方法超出了65535字节的限制。
原因:为什么我们的代码中出现此错误?
解决方案:那我该怎么做呢?
答案 5 :(得分:0)
你的方法太长了。
创建不同的方法来拆分它,使其更具可读性和可维护性。
答案 6 :(得分:0)
将字符串从代码外部化为一个* .properties / xml / json文件。 Netbeans和/或Eclipse可以很容易地为您完成。
答案 7 :(得分:0)
public static void main(String[] args) {
int[] num ={100001,100002,.......,...};
suppose the array `num` contains 100000 numbers , and your `main` function gives an error .
In such scenario , you can split the above array in two parts .
Now,you can declare 2 different array instead of just single array. For example, say
static int[] num1 ={ }; and static int[] num2={};
decalre num1 outside of main function and num2 insdie the main function
where num2 will replace num inside the main function.
so all elements of array num will be divided in two subarray num1 and num2;
divide in such way that both static and non static array could hold say 8000,2000 elements.
the code inside main method to handle all 10000 elements , an assumption only.
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)]);
}
}
so splitting that array or say dividing the elements in two parts of 8000 and rest to 2000 , could remove the error .
**solution number 2**:
Put the array outside `main` method, both num1 and num2 are now static array but the 65535 bytes limit holds also, for static initialised array and .
Split your elements, for example, you can split 10000 in 8000 and 2000, or as per you requirement in two static arrays outside the main method !!.
this error is related to storage of elements in long[] or int[] where the error occurs if the storage size surpass the limit 65535.
so in such scenario go splitting the elements for example if you are using long[],int[] split them in suitable numbers till the error get resolved.
in other words it is not mandate you only divide to 2 times , you can divide them in 4 different sizes also or different equal parts ,But again the solution to your problem may vary as per your requirement !.