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)メソッドを複数のサブメソッドに分割するだけです。


しかし、代わりにファイルから名前をロードしないのはなぜでしょうか?

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

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

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

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

もちろん、他にもたくさんありますが、これらは明らかなものです。

于 2012-09-04T05:44:46.917 に答える
3

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();
 }
于 2012-09-04T06:33:09.607 に答える
1

私はファイルから生徒の名前を読みますが、1つの回避策により、クラスも小さくなります

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

9000文字列を定義して使用する代わりに、これは1つだけを使用します。1つの文字列の制限は20億をわずかに超えています。

于 2012-09-04T07:07:54.650 に答える
1

メソッドが長すぎます。

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

于 2012-09-04T05:43:53.267 に答える