webdevqa.jp.net

「メソッドのコードが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
29
The Learner

In Javaメソッドは65535バイトを超えることはできません。

したがって、この問題を解決するには、main(String[] args)メソッドを複数のサブメソッドに分割します。

25
Pramod Kumar

エラーコードは一目瞭然のようです。

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

これは、メソッドサイズのJava 64Kbの任意のハードコードされた制限があるためです。実際には、メソッド名、定数の数など、他の多くのものが64Kに制限されています。 Java 8仕様 または Java 7仕様 を参照してください。)

これを回避するには、main(String[] args)メソッドを複数のサブメソッドに分割するだけです。


しかし、代わりにファイルから名前をロードするだけではどうですか?

現在提案している方法でそれを行う際の問題のいくつかは次のとおりです。

  • まず、詳細をハードコーディングします。これはほとんどの場合、悪いことです( this を参照)。

  • 次に、そのエラーメッセージが表示されます。そして

  • 第三に、コードを非常に読みにくくします。

もちろんもっとたくさんありますが、これらは明白なものです。

12
Infiltrator

Studentnames配列の初期化は、メインメソッドのサイズにカウントされます。学生の名前は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();
 }
2

私はファイルから学生の名前を読みますが、1つの回避策はクラスを小さくします

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

9000個の文字列を定義して使用する代わりに、1つだけを使用します。単一のストリングの制限は20億をわずかに超えています。

1
Peter Lawrey

メソッドが長すぎます。

別のメソッドを作成して分割し、読みやすく保守しやすくします。

1
user1565007
    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 !.
0
natwar kumar

メソッドmain(String [])のコードが65535バイトの制限を超えています

あなたのエラーが言うように、メインメソッドは65535バイトの制限を超えています。

理由:コードでこのエラーが発生した理由

  • 配列のメモリ割り当ては順番に行われることがわかっています。すなわち;このような膨大な容量がRAM=で継続的に利用できる場合、メモリは配列に割り当てられます。
  • いくつかの「9000」文字列を保持する文字列配列を使用しました-これは大きすぎてメモリに保持できません
  • RAMは、その間、そのような巨大なスペースが連続して存在しない可能性があるため、そのエラーが発生した可能性があります。

解決策:だから私はこれのために何ができますか?

  • このような巨大なサイズの値を保存するために、読み取り/書き込み用のファイルを好む場合があります-必要に応じてファイルの一部を読み取ることができます
  • 最初に全体にメモリを割り当てる代わりに、要素が追加されるとメモリを増やすArrayListにこれらの文字列を保存できます。
0
rm -rf star

コードの文字列を1つの* .properties/xml/jsonファイルに外部化します。 NetbeansやEclipseは簡単にあなたのためにそれを行うことができます。

0
Rogerio