it-swarm.com.de

Kompilierungsfehler "Code zu groß" in Java

Gibt es eine maximale Größe für Code in Java? Ich habe eine Funktion mit mehr als 10.000 Zeilen geschrieben. Eigentlich weist jede Zeile einer Array-Variablen einen Wert zu. 

        arts_bag[10792]="newyorkartworld";
        arts_bag[10793]="leningradschool";
        arts_bag[10794]="mailart";
        arts_bag[10795]="artspan";
        arts_bag[10796]="watercolor";
        arts_bag[10797]="sculptures";
        arts_bag[10798]="stonesculpture";  

Und beim Kompilieren erhalte ich diesen Fehler: Code zu groß

Wie überwinde ich das? 

78
trinity

Eine einzelne Methode in einer Java-Klasse kann höchstens 64 KB Bytecode enthalten.

Aber du solltest das aufräumen!

Verwenden Sie .properties-Datei, um diese Daten zu speichern, und laden Sie sie über Java.util.Properties

Sie können dies tun, indem Sie die .properties-Datei in Ihren Klassenpfad einfügen und Folgendes verwenden:

Properties properties = new Properties();
InputStream inputStream = getClass().getResourceAsStream("yourfile.properties");
properties.load(inputStream);
78
Bozho

Es gibt eine Beschränkung auf eine Bytegröße von 64 KB für eine Methode

Nachdem ich das gesagt habe, muss ich Richard zustimmen; Warum brauchst du eine so große Methode? In Anbetracht des Beispiels im OP sollte eine Eigenschaftendatei ausreichen ... oder bei Bedarf sogar eine Datenbank.

11
Everyone

Gemäß der Java Virtual Machine-Spezifikation darf ein der Code einer Methode nicht größer als 65536 Byte sein:

Der Wert des code_length-Elements muss kleiner als 65536 sein.

Dabei ist code_length in §4.7.3 definiert. Das Code-Attribut :

code_length: Der Wert des Elements code_length gibt die Anzahl der Bytes im Code-Array für diese Methode an. Der Wert von code_length muss größer als null sein. Das Code-Array darf nicht leer sein.

code[]: Das Code-Array gibt die tatsächlichen Bytes des Java Virtual Machine-Codes an, die die Methode implementieren.

10
Joachim Sauer

Das scheint ein bisschen Wahnsinn zu sein. Können Sie das Array nicht initialisieren, indem Sie die Werte aus einer Textdatei oder einer anderen Datenquelle lesen?

9
RichardOD

Versuchen Sie, Ihren Code umzugestalten. Die Größe der Methode in Java ist begrenzt.

3
Padmarag

Wie in anderen Antworten erwähnt, gibt es eine Bytecode-Beschränkung von 64 KB für eine Methode (zumindest in Suns Java-Compiler).

Für mich wäre es sinnvoller, diese Methode in mehrere Methoden aufzuteilen - jede weist dem Array bestimmte verwandte Elemente zu (möglicherweise ist es sinnvoller, eine ArrayList zu verwenden, um dies zu tun).

zum Beispiel:

public void addArrayItems()
{
  addSculptureItems(list);
  ...
}

public void addSculptureItems(ArrayList list)
{
  list.add("sculptures");
  list.add("stonesculpture");
}

Alternativ können Sie die Elemente aus einer statischen Ressource laden, wenn sie wie in einer Eigenschaftendatei behoben werden

2
saret

Sie können eine weitere Methode hinzufügen, um Speicherplatz für den Code für zusätzlichen Datenbereich zu erstellen. Möglicherweise verfügen Sie über eine Methode, die viel Datenspeicherplatz beansprucht. Versuchen Sie, Ihre Methoden aufzuteilen, da ich das gleiche Problem hatte, und beheben Sie es, indem Sie eine weitere Methode für dieselben Daten in meinem Java-Android-Code erstellen. Das Problem war danach verschwunden.

1
FermDroi

Ich bin selbst auf dieses Problem gestoßen. Die Lösung, die sich für mich bewährt hat, bestand darin, die Methode auf besser handhabbare Teile umzuwandeln und zu verkleinern. Wie Sie beschäftige ich mich mit einer fast 10K-Leitungsmethode. Durch die Verwendung statischer Variablen sowie kleinerer modularer Funktionen wurde das Problem jedoch gelöst.

Es scheint eine bessere Lösung zu geben, aber mit Java 8 gibt es keine ...

1
Azadi B.

Dieser Fehler tritt manchmal aufgrund eines zu großen Codes in einer einzelnen Funktion auf ....... Um diesen Fehler zu beheben, teilen Sie die Funktion in mehrere Funktionen auf, z

//Too large code function
private void mySingleFunction(){
.
.
2000 lines of code
}
//To solve the problem
private void mySingleFunction_1(){
.
.
500 lines of code
}
private void mySingleFunction_2(){
.
.
500 lines of code
}
private void mySingleFunction_3(){
.
.
500 lines of code
}
private void mySingleFunction_4(){
.
.
500 lines of code
}
private void MySingleFunction(){
mySingleFunction_1();
mySingleFunction_2();
mySingleFunction_3();
mySingleFunction_4();
}