104 Stimmen

Was verursacht einen java.lang.StackOverflowError

Was kann einen java.lang.StackOverflowError verursachen? Der Stack-Ausdruck, den ich erhalte, ist überhaupt nicht sehr tief (nur 5 Methoden).

4voto

IntelliJ Amiya Punkte 72793

Wenn ein Methodenaufruf von einer Java-Anwendung ausgelöst wird, wird ein Stapelrahmen im Aufrufstapel zugewiesen. Der Stapelrahmen enthält die Parameter der aufgerufenen Methode, ihre lokalen Parameter und die Rücksprungadresse der Methode.

Die Rücksprungadresse bezeichnet den Ausführungspunkt, von dem aus die Programmabarbeitung nach der Rückkehr der aufgerufenen Methode fortgesetzt wird. Wenn kein Platz für einen neuen Stapelrahmen vorhanden ist, wird der StackOverflowError von der Java Virtual Machine (JVM) geworfen.

Der häufigste Fall, der möglicherweise den Stapel einer Java-Anwendung erschöpft, ist die Rekursion.

Bitte werfen Sie einen Blick darauf

Wie man StackOverflowError löst

2voto

Singh Punkte 21

Ich habe ein Programm mit Hibernate erstellt, in dem ich zwei POJO-Klassen erstellt habe, die jeweils ein Objekt des anderen als Datenelemente haben. Als ich im Hauptprogramm versuchte, sie in der Datenbank zu speichern, habe ich auch diesen Fehler erhalten.

Dies geschieht, weil sich beide Klassen gegenseitig referenzieren und somit eine Schleife erzeugen, die diesen Fehler verursacht.

Überprüfe also, ob in deinem Programm solche Beziehungen existieren.

1voto

Stack Overflow-Ausnahmen können auftreten, wenn ein Thread-Stapel so groß wird, dass er das maximale Limit erreicht.

Anpassen der Stapelgrößen (Xss und Xmso) Optionen...

Ich schlage vor, dass Sie diesen Link sehen: http://www-01.ibm.com/support/docview.wss?uid=swg21162896 Es gibt viele mögliche Ursachen für einen StackOverflowError, wie Sie im Link sehen können....

0voto

Julz Etnalob Punkte 1

In meinem Fall habe ich zwei Aktivitäten. In der zweiten Aktivität habe ich vergessen, super in der onCreate Methode zu setzen.

super.onCreate(savedInstanceState);

0voto

Ich hatte das gleiche Problem

Role.java

 @ManyToMany(mappedBy = "roles", fetch = FetchType.LAZY,cascade = CascadeType.ALL)
 Set businessUnits =new HashSet<>();

BusinessUnitMaster.java

@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(
        name = "BusinessUnitRoles",
        joinColumns = {@JoinColumn(name = "unit_id", referencedColumnName = "record_id")},
        inverseJoinColumns = {@JoinColumn(name = "role_id", referencedColumnName = "record_id")}
)
private Set roles=new HashSet<>();

Das Problem ist, dass, wenn Sie BusinessUnitMaster und Role erstellen müssen Sie das Objekt auf beiden Seiten speichern für RoleService.java

roleRepository.save(role);

für BusinessUnitMasterService.java

businessUnitMasterRepository.save(businessUnitMaster);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X