# StackOverflow abfangen



## 0xdeadbeef (25. Jan 2005)

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?


----------



## Beni (25. Jan 2005)

Also bei mir kann ich Overflows abfangen:

```
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...


----------



## bygones (25. Jan 2005)

dito

```
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);
	}
}
```


----------



## meez (25. Jan 2005)

Das ist ein Error KEINE Exception und sollte eigentlich nicht vorkommen!!
Da ist dein Parser einfach nicht ok... (Wahrscheinlich eine Endlosrekursion)


----------



## bygones (25. Jan 2005)

nein muss nicht endlos sein... ab einer gewissen Tiefe wird der Error geworfen... d.h. aber noch nicht endlos


----------



## meez (25. Jan 2005)

Nichts ist endlos... :meld:


----------



## DesertFox (25. Jan 2005)

doch Wurzel 2


----------



## bygones (25. Jan 2005)

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 (25. Jan 2005)

Und was ist mit PI...


----------



## Roar (25. Jan 2005)

und was ist mit menschlicher dummheit?


----------



## 0xdeadbeef (25. Jan 2005)

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.


----------



## Vatar (31. Mai 2005)

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


----------



## dotlens (31. Mai 2005)

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?


----------



## Vatar (31. Mai 2005)

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.


----------



## Vatar (1. Jun 2005)

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?


----------



## Vatar (5. Jun 2005)

Fehler gefunden: 
Mann sollte bei der Methode getParent(Object element) auch wirklich das Parent zurückgeben und nicht das element   .


----------

