Aufgabe Array, Exception

coldstone

Bekanntes Mitglied
Hallo frende,

habe folgende aufgabe zu lösen:


Java:
public static void test(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");
test(-j, -j);
} finally {
System.out.println(a[i]);
System.out.println("C");
}
}

Welche Ausgabe liefern die folgenden Aufrufe von test?


test (3,1)

HIer ist doch bestimmt die komponenten gemeint oder? Also in diesem fall für x = 3 und für y = 5. Richtig?
 
Habe ich versucht, kriege aber die testmethode nicht hin.

Habe eine Klasse aufgabe erstellt:

Java:
public class aufgabe {
	
	public static void test(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");
		test(-j, -j);
		} finally {
		System.out.println(a[i]);
		System.out.println("C");
		}
	}
	
	
}



ich kriege aber keine testmethode hin.
 
Java:
public class aufgabetest {
	
	
	public static void main(String[] args) {
		
		test(3,1);
	}

}

???? geht nicht. compiler fehler.
 
Java:
public class Leerprogramm {    
    public static void main (String[] args) {
       try {test(3, 1);} 
       catch (Exception e) {e.printStackTrace();}
    } 
    
    
    public static void test(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");
	    	test(-j, -j);
    	} finally {
	    	System.out.println(a[i]);
	    	System.out.println("C");
    	}
    }
    
}
 
Alles klar habs jetzt.

Java:
public class aufgabe {
	
	
	public static void main(String[] args) throws Exception {
		
		test(3,1);
	}


		public static void test(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");
			test(-j, -j);
			} finally {
			System.out.println(a[i]);
			System.out.println("C");
			}
		}
		
	}
 
Es kommen die werte A,2,5,1,C raus.

"A" und "2" sind nachvollziehbar, aber wie kommt man an die "5"?

Es wird ja der else Block ausgeführt da i ungleich 0 ist.

Java:
.
.
.
else {
            System.out.println(a[i++]);
            int x = j / i;
            System.out.println(a[x]);
.
.
.

"2" wird ja durch

Java:
System.out.println(a[i++]);
ausgegeben.

"i" wird doch weiterhin als "2" gespeichert, oder bewirkt "System.out.println(a[i++]);" das i = als 3 gespeichert wird? Dies ist doch nur für die Ausgabe, oder?
Aber bei beiden fällen würde doch "int x = j / i;" eine Exception auslösen. Somit währe die nächste Ausgabe ja "B".
Aber in unserem fall ja leider nicht. Was mache ich bei der Denkweise denn falsch???
 
Hast du dir den Link von Kiri mal durchgelesen? Da steht´s drin (Stichwort finally).

EDIT: int x = i / j wirft keine Exception, da ist eine ganz normale Int-Division (wenn i = 4 und j = 1 --> int (1 / 4) = 0)
 
Zuletzt bearbeitet:
Aber wenn ich eine Exception auslöse, wird denn dann nicht der block in Exception bearbeitet?

In diesem Fall:

Java:
catch (Exception e) {
            System.out.println("B");
            test(-j, -j);

???
 
Ja, aber du "löst" ja keine Exception aus... wie bereits gesagt: der Ausdruck int x = i / j produziert keine Exception (es sei denn, j wäre null, was aber nicht der Fall ist). Also wird auch nicht der catch-Block ausgeführt und die Anwendung setzt mit finally fort.
 
Hätte noch eine frage. Undzwar die array werte im finally block beziehen sich doch immer auf die Ursprungswerte oder?
Ich mein die veränderung der Werte im try block hat letztenendes keine auswirkung auf den finally block?
 
Was sagt dir denn deine Ausgabe? Ist das so oder ist das nicht so?

EDIT: Also bei mit ist i im finally-Block 4, vlcht. ist es bei dir ja anders..
 
Zuletzt bearbeitet:
Das der finally block unverändert bleibt da ich ja "1" rausbekomme! Würde der finally block abhängig von den veränderungen der try blöcke sein, wäre es ja

Java:
System.out.println(a[3]);

somit wäre die ausgabe "2". Richtig?
 
Dein Ursprungswert ist i=3 und im finally ist es dann i=4. Aus meiner sicht verändert sich der Wert.

Vielleicht machst du doch lieber Feierabend und schaust dir das morgen nochmal an.
 
Wenn ich noch eine frage fragen darf.

Bei test (4,2) bekomme ich die werte A,1,5 und dann eine exception fehlermeldung:

undzwar:
Java:
Exception in thread "main" java.lang.Arra
        at aufgabe.test(aufgabe.java:25)
        at aufgabe.main(aufgabe.java:4)

Müsste er aber nicht

Java:
.
.
catch (Exception e) {
        System.out.println("B");
        test(-j, -j);
        } finally {
        System.out.println(a[i]);
        System.out.println("C");
        }

ausführen???
 
Wenn ich noch eine frage fragen darf.

Bei test (4,2) bekomme ich die werte A,1,5 und dann eine exception fehlermeldung:

undzwar:
Java:
Exception in thread "main" java.lang.Arra
        at aufgabe.test(aufgabe.java:25)
        at aufgabe.main(aufgabe.java:4)

Müsste er aber nicht

Java:
.
.
catch (Exception e) {
        System.out.println("B");
        test(-j, -j);
        } finally {
        System.out.println(a[i]);
        System.out.println("C");
        }

ausführen???


nein, dein Fehler tritt erst im Finally auf, also außerhalb des Try-/Catch- und zwar genau hier:

Java:
finally {
System.out.println(a[i]);

weil i=5 ist, das Array aber nur von i=0 bis i=4 geht!
 
Aber müsste dann dieser fehler, nicht diese Anweisung ausführen lassen?

Java:
.
.
catch (Exception e) {
        System.out.println("B");
        test(-j, -j);
.
.

Also somit "B" ausgeben und mit test(-j,-j) weiterarbeiten?
 
Letzte test Analyse, dann reichts auch für heute.

mit test (1,-2)

bekomme ich A,4,B usw.

Aber ich komme auf A,3,B usw.

A wird ja als erstes ausgegeben, aber i = 1, deswegen gehts mit dem else Block weiter.

Java:
.
.
else {
System.out.println(a[i++]);
int x = j / i;
System.out.println(a[x]);
}
.
.

und bei mir wäre
Java:
System.out.println(a[2]);

somit müsste doch die Ausgabe "3" sein. Aber der compiler spuckt 4 aus.
 
nein i++ bedeutet, das i=1 benutzt wird und erst danach wird i inkrementiert.

bei ++i wird erst i inkrementiert und dann i=2 benutzt.

probiere es mal aus
 
Bin schon soweit gekommen:

A
4
B
A
3
5 ????


wie kommt die fünf zustande?

Beim ersten durchlauf wird eine Exception ausgelöst.
"B" wird ausgegeben und test ( -j,-j) wird gestartet. Was bewirkt eigentlich zweimal "-j"?
Da Exception ausgelöst wird durch int x = -2 / 2, und System.out.println(a[-1]) im else block, fahre ich dann mit dem Wert (-j / -j) fort oder mit dem wert von "i" das als letztes gespeichert ist?
test (-j / -j) bringt mich bischen durcheinander!

Hat sich erstmal erledigt. 😀
 
Zuletzt bearbeitet:
OK

Meine Lösung:

A,4,B,A,3,5,2,C

Compiler Lösung:

A,4,B,A,3,5,2,C,3,C

Wurde auch schon in dem anderen Beitrag besprochen aber ohne erfolg.

Wiese wird finally 2 mal ausgelöst?
 
finally wird immer ausgeführt. Ganz egal ob ne Exception fliegt oder nicht. Selbst bei nem return würde finally noch ausgeführt zu werden.
 
beim ersten durchlauf wird der erste Testdurchlauf VOR dem finally unterbrochen, dann wird der zweite Testdurchlauf komplett abgearbeitet (da es hier keine Exception gibt) und danach wird das finally des ersten Testdurchlaufs nachgeholt
 
OK, also wenn zwischendurch finally erreicht wird, wird er gemerkt und die restlichen Durchläufe erst abgearbeitet. Danach wird finally mit den gemerkten finally werten ausgegeben und am schluss nochmals ausgegeben. Richtig?

Wenn ich einen noch komplexeren Quellcode hätte, würde er sich immer den finally block mit den aktuellen Werten merken und ganz am schluss alle finally blöcke hintereinander ausgeben. Korrekt?
 
Korrekt!

(Aber in anbetracht der späten Stunden gebe ich keine Garantie mehr auf irgendeine Gehirnleistung 😉 Gute N8)
 

Zurück
Oben