StackOverflowError

melena

Grünschnabel
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?

Code:
	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
 
Zuletzt bearbeitet:
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?
 
Zuletzt bearbeitet:
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
 
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
 
Zurück