# StackOverflowError



## melena (17. Juli 2010)

Hallo zusammen,

ich habe ein Problem, das ich schon seit gestern nicht lösen kann. Ich habe eine rekursive Methode, bei deren Ausführung immer den Fehler _StackOverflowError  _ ausgegeben wird. Ich habe schon versucht die Methode iterativ zu implementieren, wobei ich für die Speicherung von x-, y-Koordinaten _ArrayList _ benutzte. Bei der Ausführung wurde dann _OutOfMemoryException_ ausgegeben. Ich weiß nicht mehr, wie ich die Methode implementieren sollte, um diese Fehler zu vermeiden. Vielleicht könntet ihr mir ein paar Tipps dafür geben? 


```
public void methode(int x, int y) {
		
		if ((x >= 0) && (x < image.getWidth())&& (y >= 0) && (y < image.getHeight())
			&& colorCheck(x, y)) {
			
			labelArray[x][y] = FOREGROUND;		
		
		        if (labelArray[x + 1][y] == BACKGROUND) {
			        methode(x + 1, y);
		         }
		        if (labelArray[x][y + 1] == BACKGROUND) {
			        methode(x, y + 1);
		         }
		         if (labelArray[x][y - 1] == BACKGROUND) {
			        methode(x, y - 1);
		         }
		         if (labelArray[x - 1][y] == BACKGROUND) {
			        methode(x - 1, y);
		        }
                 }
	}
```

Vielen, vielen Dank im Voraus
mfg, melena


----------



## HonniCilest (17. Juli 2010)

Was passiert denn, wenn x/y 0 sind oder x/y die Größe des Arays überschritten haben? Ich meine es gibt bei x=0 kein x-1...
Was ist bei dir die Abbruchbedingung?
Was genau soll deine Methode eigentlich tun?


----------



## melena (17. Juli 2010)

nein, in dem Fall gibt es kein Fehler, weil _labelArray _so definiert ist, dass es um 2 Zeilen und 2 Spalten größer als image ist.  _LabelArray _wird mit BACKGROUND initialisiert. (BACKGROUND = 0, FOREGROUND = 1) 

Methode bekommt als Eingabeparameter Koordinate eines Punktes(Pixel) des  _image_, auf dem mit der Maus geklickt wurde. Weiterhin soll die Methode eine zusammenhängende Menge von Pixel bestimmen. In diese Menge werden direkte und indirekte Nachbarpixel des  Punktes (x,y) eingenommen, wenn seine Farbwerte  mit dem Farbwert des Punktes (x,y) übereinstimmen oder sich in einem zulässigen Abwechslungsreich befinden, der durch einen Toleranzwert definiert wird. Es wird in der Methode _colorCeck _überprüft. Wenn die Bedingung erfüllt ist, wird im   _LabelArray _das Punkt (x,y) mit  FOREGROUND markiert und die Methode _methode _für vier Nachbarpixel ausgeführt, wenn sie im  LabelArray noch nicht mit  FOREGROUND markiert sind.

Ich hoffe, dass die Beschreibung mehr oder weniger klar ausgedrückt ist.

Vielen Dank für die Hilfe


----------



## miffi (19. Juli 2010)

Howdie.

Ich glaube, du rennst im Kreis mit den If-Abfragen.
Beispiel: Sagen wir mal, die Überprüfung für _labelArray[x + 1][y] == BACKGROUND_ bei x=100 trifft zu. Dann rufst die Methode mit _methode(101, y)_ nochmals auf. Trifft die Überprüfung _labelArray[101 - 1][y] == BACKGROUND)_ ebenfalls zu, rufst du  _methode(100, y)_ auf. Ergo, du rufst genau die gleiche Überprüfung nochmals auf, die als erstes schon durchgeführt wurde, was zur Folge hat, dass du auch die zweite Überprüfung nochmals durchführst. So haust du den Stack voll mit immer den selben Aufrufen und der Overflow entsteht. Zumindest würde ich das auf den ersten Blick vermuten.

An deiner Stelle würde ich zusätzliche Abbruchbedingungen einbauen, z.B. einen Zähler für die maximale Entfernung von Nachbarn oder dass ein bereits überprüftes Pixel nicht nochmals überprüft wird. Abbruchbedingungen kann man bei Rekursionen nie genug haben 

Gruß,
miffi


----------

