it-swarm.com.de

Wie zu beheben "Der Code der Methode .. überschreitet die 65535 Byte-Grenze"?

Ich habe folgenden Code:

public static void main(String[] args) {
    try {
        String[] studentnames = {
            /* this is an array of 9000 strings... */
        };
    }
}

Beim Versuch, dies zu kompilieren, wird folgende Fehlermeldung angezeigt:

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

In Java dürfen Methoden nicht mehr als 65535 Bytes enthalten.

Um dieses Problem zu beheben, teilen Sie Ihre main(String[] args)-Methode in mehrere Untermethoden auf.

23
Pramod Kumar

Der Fehlercode scheint ziemlich selbsterklärend zu sein.

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

Dies liegt daran, dass es in Java ein beliebiges, hartcodiertes Limit von 64 KB für Methodengrößen gibt. (Und eigentlich sind viele andere Dinge auf 64 KB beschränkt, wie Methodennamen, die Anzahl der Konstanten usw. Weitere Informationen finden Sie in den Java 8-Spezifikationen oder den Java 7-Spezifikationen .)

Um dies zu umgehen, müssen Sie lediglich Ihre main(String[] args)-Methode in mehrere Untermethoden aufteilen.


Warum aber nicht einfach die Namen aus einer Datei laden?

Einige der Probleme, die Sie so machen, wie Sie es gerade vorschlagen, sind:

  • erstens sind Sie hartcodierende Details, was fast immer eine schlechte Sache ist (siehe this );

  • zweitens erhalten Sie diese Fehlermeldung. und

  • drittens machen Sie Ihren Code sehr schwer lesbar.

Es gibt natürlich noch viel mehr, aber das sind die offensichtlichen.

11
Infiltrator

Das Initialisieren des Studentennamens zählt zur Größe der Hauptmethode. Da es 9000 Schülernamen gibt, kann jeder Name nur etwa 7 Zeichen lang sein, bevor Sie keinen Platz mehr haben. Wie von den anderen angegeben, müssen Sie die Größe der Methode reduzieren. Sie können es in Stücke teilen, wie Pramod sagte, aber in diesem Fall besteht der Hauptteil der Methode aus Daten. Ich würde das tun, wie der Infiltrator sagt, die Namen in eine separate Datei aufteilen und einfach in Ihrem Hauptverzeichnis lesen. So etwas wie Commons-io kann verwendet werden, um die Position, in der Sie beginnen, effektiv zu erreichen. 

List<String> namelist = FileUtils.readLines(new File("studentnames.txt"));
String[] studentnames = namelist.toArray(new String[0]);

Es kann nützlich sein, die Liste zu verarbeiten, anstatt sie in ein Array zu konvertieren, oder Sie können stattdessen einen LineIterator verwenden

LineIterator it = FileUtils.lineIterator(file);
try {
     while (it.hasNext()) {
         String line = it.nextLine();
         // do something with line
     }
 } finally {
     it.close();
 }
2

Ich würde die Schülernamen aus einer Datei lesen, jedoch umgehen, wodurch die Klasse kleiner wird

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

Anstatt 9000 Zeichenfolgen zu definieren und zu verwenden, wird nur eine verwendet. Die Grenze für einen einzelnen String liegt bei knapp über 2 Milliarden.

1
Peter Lawrey

Der Code der Methode main (String []) überschreitet die Grenze von 65535 Bytes 

Wie Ihr Fehler sagt, überschreitet die Hauptmethode die Grenze von 65535 Bytes.

Grund: Warum haben wir diesen Fehler in unserem Code bekommen?

  • Wir wissen, dass die Speicherzuordnung für das Array sequentiell erfolgt. dh; Der Speicher würde für das Array reserviert, wenn in RAM kontinuierlich so viel Speicherplatz zur Verfügung steht.
  • Wir haben ein String-Array verwendet, das einige "9000" -Strings enthält - was für den Speicher zu groß ist 
  • Der RAM verfügt während dieser Zeit möglicherweise nicht ständig über einen so großen Speicherplatz. Daher haben wir möglicherweise diesen Fehler.

Lösung: Also was kann ich dafür tun?

  • Für das Speichern eines solchen Werts für eine große Größe bevorzugen wir möglicherweise eine Datei zum Lesen/Schreiben - damit wir bei Bedarf einen Teil einer Datei lesen können
  • Wir können diese Zeichenfolgen in einer ArrayList speichern, die ihren Speicher vergrößert, wenn ein Element hinzugefügt wird, anstatt zunächst Speicherplatz zuzuweisen.
1
rm -rf star
    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

Externalisieren Sie einfach Strings aus Ihrem Code in eine * .properties/xml/json-Datei. Netbeans und/oder Eclipse können dies leicht für Sie tun.

0
Rogerio

Deine Methode ist zu lang.

Erstellen Sie verschiedene Methoden, um sie aufzuteilen und sie lesbarer und wartbarer zu machen.

0
user1565007