# Ausgabe falsch???



## iks (29. Jan 2012)

Guten Tag!

Gegeben ist folgender Programmcode:


```
class test {

public static void testr(int i, int j) throws Exception {
	int[] a = { 5, 4, 3, 2, 1 };

	try {
		System.out.println("A");

		if (i == 0) {
			i = ++j - a[j];
			System.out.println(j);
			} else {
				System.out.println(a[i++]);
				
				int x = j / i;
				System.out.println(a[x]);
			}
		} catch (Exception e) {
			System.out.println("B");
			testr(-j, -j);
			} finally {
				System.out.println(a[i]);
				System.out.println("C");
					  }
			}
}
```

Wenn ich jetzt testr mit i=1 und j=-2 aufrufe, also so: testr(1,-2);
Gibt mir Eclipse folgende Ausgabe:
A
4
B
A
3
5
2
C
3
C

Ich kann das nach nachvollziehen, bis auf die letzten beiden Zeilen:
3
C

Das finally-Statement wird aus irgendeinem Grund 2 Mal aufgerufen, und die Variable i dekrementiert, so scheint es mir. Aber warum? Bei mir war nach 2  C eigentlich Ende...
Kann mir das jemand erklären?

Vielen Dank im Vorraus schonmal für alle Mühen und Antworten!


----------



## chalkbag (29. Jan 2012)

Es wird im Exception-Handling die Methode Testr nochmals aufgerufen. Bei der aktuellen Implementierung wird pro Aufruf der Methode Testr der finally Block aufgerufen. Folglich wird er zweimal aufgerufen.
Bedenke, wenn der Methodenaufruf testr aus dem Exception-Block zurück kehrt, wird noch der Finally Block verarbeitet.


----------



## iks (29. Jan 2012)

So ganz verstehe ich es noch nicht:
Das finally wird 2 mal hintereinander mit verschiedenen Werten für i aufgerufen.
Merkt sich der Compiler dann den Wert für i aus dem ersten Versuch(der die Exception auslöst)?


----------



## chalkbag (29. Jan 2012)

Im ersten Durchlauf rufst du die Methode mit i und ja auf (glaube 1 und 2 war das). In diesem Aufruf wird die exception-handling aufgerufen, welche die Methode nochmals mit -j und j aufruft. Also wird zuerst der Finally - block mit -j und j verarbeitet und anschließend (nach dem der Aufruf aus der Exception zurück kehrt) wird der finally block noch mit 1 und 2 verarbeitet.

Ich hoffe ich habe mich jetzt verständlicher ausgedrückt.


----------

