HOWTO · Java
Java StackOverflowError
In diesem Artikel besprechen wir die möglichen Ursachen für den Fehler java.lang.StackOverflowError, der in der Hauptmethode eines Java-Programms auftritt.
Auf dieser Seite
Dieser Artikel befasst sich mit den möglichen Ursachen des Fehlers java.lang.StackOverflowError in der Methode main() eines Java-Programms.
der java.lang.StackOverflowError in Java
Der java.lang.StackOverflowError wird in Java geworfen, um zu signalisieren, dass der Stack der Anwendung aufgrund einer besonders tiefen Rekursion aufgebraucht wurde. Die Klasse java.lang.StackOverflowError ist eine Erweiterung der Klasse VirtualMachineError, die signalisiert, dass die JVM entweder eine Fehlfunktion aufweist oder alle ihre Ressourcen erschöpft hat und nicht funktionieren kann.
Ursachen für java.lang.StackOverflowError
Schauen wir uns ein Beispiel an, um java.lang.StackOverflowError und die Gründe dafür zu verstehen.
Wir werden zuerst eine Hauptmethode in die Beispielklasse aufnehmen. Danach bauen wir eine Funktion namens RecursiveFunction(), die innerhalb der Hauptmethode rekursiv aufgerufen wird.
In der Funktion RecursiveFunction() zeigen wir die Zahlen mit einem Inkrement von 1 an, das nach jedem Aufruf hinzugefügt wird.
Vollständiger Quellcode:
public class example {
static int z;
public static int RecursiveFunction(int e) {
z = z + 1;
System.out.println(" Number is : " + z);
return z + RecursiveFunction(z + 1);
}
public static void main(String[] args) {
example.RecursiveFunction(z);
}
}
Sie erhalten ähnliche Ergebnisse wie das unten gezeigte.
Ausgang:
Exception in thread "main" java.lang.StackOverflowError
at java.io.PrintStream.write(Unknown Source)
at java.io.PrintStream.print(Unknown Source)
at java.io.PrintStream.println(Unknown Source)
at StackOverflowErrorClass.RecursiveFunction(StackOverflowErrorClass.java:7)
at StackOverflowErrorClass.RecursiveFunction(StackOverflowErrorClass.java:8)
at StackOverflowErrorClass.RecursiveFunction(StackOverflowErrorClass.java:8)
.
.
.
Lassen Sie uns über die Probleme im Beispielprogramm sprechen, die den java.lang.StackOverflowError verursachen.
- Wir haben ein Beispiel besprochen, bei dem der Stapel des
Threadsdie Methoden, primitivenDatentypen,Variablen,ObjektreferenzenundRückgabewertespeichert, während derthreadsie ausführt. Alle von ihnen verwenden Speicher. - Ein
java.lang.StackOverflowErrorwird ausgelöst, wenn die Stack-Größe einesthread'sso weit ansteigt, dass die maximal zugewiesene Speichermenge überschritten wird. - Die Methode
Main()ruft die FunktionRecursiveFunction()in diesem Programm auf. Die MethodeRecursiveFunction()ruft sich wiederholt selbst auf und wird aufgrund dieser Implementierung unendlich oft aufgerufen.
In diesem Fall erfolgt eine unbegrenzte Anzahl von Aufrufen der Methode RecursiveFunction(). Das Stack-Size-Limit von Thread wäre nach einigen hundert oder tausend Iterationen überschritten.
Der besprochene Code gibt die Zahlen aus, hat aber keine Bedingung, die ihn beendet. Dies ist die Ursache für den java.lang.StackOverflowError, der anzeigt, dass die Größe des Stacks vollständig aufgebraucht ist und nicht weiter ausgebaut werden kann.
Lösung von java.lang.StackOverflowError in Java
Im Folgenden finden Sie mögliche Lösungen für die Ausnahme java.lang.StackOverflowError.
Finden Sie rekursive Linien
Wir müssen den thread-Stapel richtig analysieren und nach einem Linienmuster suchen, das immer wieder auftritt. Diese Zeilen zeigen auf den rekursiv aufgerufenen Code.
Nachdem wir diese Zeilen gefunden haben, müssen wir eine umfassende Analyse des Codes durchführen, um festzustellen, ob die Rekursion niemals endet.
Erhöhen Sie die Gewindegröße
Wir haben die Möglichkeit, den Thread-Stapel zu vergrössern, um Platz für eine grössere Anzahl von Befehlen zu schaffen. Durch Veränderung der Parameter des Compilers kann die maximale Grösse des Stacks Thread erhöht werden.
Beendigungsbedingung
Um zu verhindern, dass dieselben Aufrufe wiederholt ausgeführt werden, müssen Sie sich bemühen, eine korrekte Beendigungsbedingung oder eine andere Bedingung für die rekursiven Aufrufe zu implementieren, um sicherzustellen, dass sie beendet werden.
Lassen Sie uns eine Beendigungsbedingung hinzufügen, damit wir das Problem beheben können, das im folgenden Beispielcode aufgetreten ist. Wir verwenden die if-Anweisung, um zu prüfen, wann immer z 19 erreicht; es beendet die Funktion.
if (z == 19)
return z;
Vollständiger Quellcode:
public class example {
static int z;
public static int RecursiveFunction(int e) {
z = z + 1;
System.out.println(" Number is : " + z);
if (z == 19)
return z;
return z + RecursiveFunction(z + 1);
}
public static void main(String[] args) {
example.RecursiveFunction(z);
}
}
Ausgang:
Number is : 1
Number is : 2
Number is : 3
Number is : 4
Number is : 5
Number is : 6
Number is : 7
Number is : 8
Number is : 9
Number is : 10
Number is : 11
Number is : 12
Number is : 13
Number is : 14
Number is : 15
Number is : 16
Number is : 17
Number is : 18
Number is : 19