Java StackOverflowError
-
der
java.lang.StackOverflowError
in Java -
Ursachen für
java.lang.StackOverflowError
-
Lösung von
java.lang.StackOverflowError
in Java
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
Threads
die Methoden, primitivenDatentypen
,Variablen
,Objektreferenzen
undRückgabewerte
speichert, während derthread
sie ausführt. Alle von ihnen verwenden Speicher. - Ein
java.lang.StackOverflowError
wird ausgelöst, wenn die Stack-Größe einesthread's
so 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
I have been working as a Flutter app developer for a year now. Firebase and SQLite have been crucial in the development of my android apps. I have experience with C#, Windows Form Based C#, C, Java, PHP on WampServer, and HTML/CSS on MYSQL, and I have authored articles on their theory and issue solving. I'm a senior in an undergraduate program for a bachelor's degree in Information Technology.
LinkedInVerwandter Artikel - Java Error
- Adresse wird bereits verwendet JVM_Bind-Fehler in Java
- Android Java.Lang.IllegalStateException behoben: Methode der Aktivität konnte nicht ausgeführt werden
- Ausnahme im Hauptthread Java.Lang.ClassNotFoundException in IntelliJ IDEA
- Ausnahme im Hauptthread Java.Lang.NoClassDefFoundError
- Beheben Sie das Problem, dass Java nicht installiert werden kann. Es gibt Fehler in den folgenden Schaltern
- Beheben Sie den Fehler `Es wurde keine Java Virtual Machine gefunden` in Eclipse