Java StackOverflowError
- 
          
            der java.lang.StackOverflowErrorin Java
- 
          
            Ursachen für java.lang.StackOverflowError
- 
          
            Lösung von java.lang.StackOverflowErrorin 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 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
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
