Java StackOverflowError

Muhammad Zeeshan 12 Oktober 2023
  1. der java.lang.StackOverflowError in Java
  2. Ursachen für java.lang.StackOverflowError
  3. Lösung von java.lang.StackOverflowError in Java
Java StackOverflowError

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.

  1. Wir haben ein Beispiel besprochen, bei dem der Stapel des Threads die Methoden, primitiven Datentypen, Variablen, Objektreferenzen und Rückgabewerte speichert, während der thread sie ausführt. Alle von ihnen verwenden Speicher.
  2. Ein java.lang.StackOverflowError wird ausgelöst, wenn die Stack-Größe eines thread's so weit ansteigt, dass die maximal zugewiesene Speichermenge überschritten wird.
  3. Die Methode Main() ruft die Funktion RecursiveFunction() in diesem Programm auf. Die Methode RecursiveFunction() 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
Muhammad Zeeshan avatar Muhammad Zeeshan avatar

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.

LinkedIn

Verwandter Artikel - Java Error