StackOverflow abfangen

Status
Nicht offen für weitere Antworten.

0xdeadbeef

Top Contributor
Habe mir einen mathematischen Parser geschrieben, in dem man auch Funktion definieren und (wenn man will) rekursiv aufrufen kann. Dabei kommt es relativ rasch zu einem StackOverflow. Natürlich mochte ich dann auch in der Konsole einen Stack Overflow melden, also muß ich den Overflow per catch abfangen und entsprechend behandeln.
Theoretisch sollten Error-Objekte wie StackOverflow "throwable" sein, allerdings scheint der catch-Block ignoriert zu werden.

Die Javainsel schreibt dazu:
"Da die Fehler »abnormales« Verhalten anzeigen, müssen sie auch nicht mit einem try/catch-Block aufgefangen werden. Allerdings ist es möglich, die Fehler mit einem try/catch aufzufangen, da Error-Klassen Unterklassen von Throwable sind und sich daher genauso verhalten. In sofern ist ein Auffangen legitim und auch ein finally ist korrekt."

Warum geht das in der Praxis aber trotzdem nicht?
 
Also bei mir kann ich Overflows abfangen:
Code:
public class Test4{
	public static void main( String[]args ){
		try{
			main( args );
		}
		catch( StackOverflowError t ){
			System.out.println( "catched" );
		}
	}
}

Bist du sicher, dass du das try-catch um den richtigen Bereich gemacht hast?
Sonst lass mal Code sehen...
 
dito
Code:
ublic class RecTest {
	public static void main(String[] args) {
		try {
			recTest(0);
		}
		catch(StackOverflowError e) {
			System.out.println("overflow !!");
		}
	}
	
	public static void recTest(int i) {
		recTest(i+1);
	}
}
 
Das ist ein Error KEINE Exception und sollte eigentlich nicht vorkommen!!
Da ist dein Parser einfach nicht ok... (Wahrscheinlich eine Endlosrekursion)
 
nein muss nicht endlos sein... ab einer gewissen Tiefe wird der Error geworfen... d.h. aber noch nicht endlos
 
DesertFox hat gesagt.:
doch Wurzel 2 😛
gibts dazu eigentlich einen mathematischen Beweis ? würd mich interessieren...

bygones - wir weichen vom Thema ab... also bitte bei der Problematik bleiben !!
 
meez hat gesagt.:
Das ist ein Error KEINE Exception und sollte eigentlich nicht vorkommen!!
Da ist dein Parser einfach nicht ok... (Wahrscheinlich eine Endlosrekursion)

Ein sehr intelligenter Einwurf :roll:


An die anderen:
Leider muß ich allerdings eingestehen, daß ich in nächtlicher Programmierverwirrung den catch-BLock tatsächlich an der falschen Stelle eingebaut hatte. Klappt jetzt wie gewünscht. Mea culpa.
 
moin moin.
Hab grad das gleiche Problem. Ich durchsuche ca 480 xml-Files (sind nicht all zu groß), lege aber relativ viele Objekte an (z.B. für einen JFace TreeViewer). Wenn ich meine Suche mehrfach durchführe taucht sporadisch ein Stackoverflow auf und das seltsame an der Sache: er taucht sofort auf (nachdem ich die Suche gestartet habe, welche ca 30sec benötigt). Ich habe auch nirgendwo eine Endlosschleife (ca 3 Schleifen und das wars) oder komplexe mathematische Berechnungen.
Desweiteren gebe ich bereits jedesmal vor dem Start der Suche nicht benötigte Objekte frei und fordere eine GarbageCollection an.

Kennt einer dieses Problem und weiß eine Lösung?
thx
 
wenn der overflow erst beim 2ten mehrfachen ausführen auftauch und dann schon am anfang deuted das darauf, dass du resourcen von den ersten versuchen noch belegst. vieleicht erstellst du neue variablen? fügst einer map immer mehr hinzu ohne sie vorher zu leeren?
 
Danke für den Tip. An einer Stelle hab ich was geändert, aber der Overflow taucht immer noch sporadisch auf (wenn ich immer gleich teste taucht er mal auf und dann wieder ewig gar nicht).
Ich verwende sehr viele Zeiger für Listen, erzeuge aber eigentlich keine neuen Objekte.
 
So, ich konnte den Fehler nun eingrenzen. Man könnte diesen Thread jetzt eigentlich schon zum SWT-Forum packen (ich schreib aber mal hier weiter).

Ich beschreib mal kurz mein Proggi:
ich durchsuche mehrere XMLs, welche eine Query speichern, nach DataObjects und Attributen. Finde ich die gesuchte Kombination, so wird einem JFace-TreeViewer (das ist der Überltäter) diese Query hinzugefügt.
Sieht dann nach der Suche ungefähr so aus:

Query 1
--> DataObject 1
------> Attribut 1
------> Attribut 2
--> DataObject 2
--> DataObject 3
------> Attribut 1
------> Attribut 2

und jetzt das Problem: der StackOverflow taucht bei der nächsten Suche nur dann auf, wenn ich den Tree in irgendeiner Form aufklappe. Lasse ich ihn komplett geschlossen, kann ich zig mal suchen :autsch:?

Die ArrayList welche ich im Model zum speichern der Struktur verwende leere ich vor jeder neuen suche, refreshe den TreeViewer, fordere eine GarbageCollection an und starte erst dann die Suche -> nützt alles nix

P.S: den Source will ich euch jetzt nicht antun, ist nämlich relativ viel. Hab mich, was den TreeViewer und das Model betrifft sehr stark an dieses Tutorial gehalten (ohne die Filter)

Hat jemand einen Tip?
 
Fehler gefunden:
Mann sollte bei der Methode getParent(Object element) auch wirklich das Parent zurückgeben und nicht das element 😳 .
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben