java Exceptionhandling

Helios co.

Lt. Commander
Registriert
März 2005
Beiträge
1.863
Hallo,

gibt es in Java eine Möglichkeit ein Programmabbruck nach einer geworfenen exception zu verhindern?

Beispielsweise in einer ähnlichen Situation:
Ich habe die Methode a(parameter z)

Jetzt rufe ich aus main a mit einmal mit parameter z1 danach mit z2 und danach mit z3

Wenn jetzt in z2 eine Exception geworfen wird (z.B IndexArrayOutOfBounds...etc.),
dann wird es ja zum fall z3 nicht mehr kommen.
 
Hat sich schon von selbst erledigt.
Falls es aber noch einen interessiert:

In der main einfach jeden Aufruf der Methode in einen try catch Block pressen...
 
Code:
try
{
   // alles was du machen willst
   // so viele Zeilen wie du magst
}
catch( Exception e )
{
   // wie du auf die geworfene Excpetion reagieren willst
   // z.B. System.out.println( "Hilfääää. Gaaaanz böse Exception." );
}
Im ersten Thread dieses Forums, hat es einen Link auf ein Online-Buch (gibt es auch zum in Papierform kaufen): Java ist auch eine Insel.
Lies dich dort mal ein zum Thema Exceptionhandling.
Das ist ganz wichtig bei Java.
 
Das Buch kenne ich, auch die Alternative: GoTo Java.

Aber leider steht da zumindest in diesem Fall nicht das was ich brauche.

Ich glaube du hast auch nicht ganz verstanden was ich will, aber das dürfte an mir liegen, daher nochmals:

Ich habe eine Methode:

static a(int[] z){
//hier können max 3 Fälle auftreten, bei denen es zu einem fehler kommen kann
geworfen wird der Fehler in der Form:
throw new IllegalArgumentException("blabla");
}

Aus der main rufe ich die Methode jetzt mehrmals auf, und zwar in der Form:

a(z1);
a(z2);
a(z3);

Wenn jetzt in a(z2) dummerweise eine der 3 Exceptions geworfen wird, dann wird das Programm terminiert und a(z3) nicht mehr aufgerufen.

Ich aber möchte, dass es doch geschieht...und dazu habe ich leider nichts in der Literatur gefunden :(

Und meine Idee es mit try catch zu machen hat jetzt leider auch nicht geklappt.

Hmm, vielleicht weisst du jetzt was ich meinte?
 
Mal ganz naiv:
Um jeden einzelnen Aufruf von a() einen try/catch-Block machen?

Ist a() wirklich eine static Funktion?
Gibt a() nichts zurück?
Aber das nur am Rande.
 
Vielleicht hilft ein finally-Block - kann an einem catch-Block angehängt werden und wird auf alle Fälle ausgeführt
 
Hi,
du kannt jeden einzelnen Aufruf in einen try/catch Block packen. Wenn eine Exception fliegt, dann solltest du sie fangen und behandeln. Ob dein Programm danach weiterlaufen kann/soll musst du entscheiden. Schliesslich zeiget eine Exception einen Ausnahmezustand an, der vermutlich behandelt werden sollte.
Vielleicht ist es geschickter, die Exceptions direkt in der Methode zu fangen und mit einem möglichen Fehlerzustand anders umzugehen (Ausgabe, Logger, etc.).
Der finally Block sollte nicht unbedingt dazu verwendet werden um Code auszuführen komme, was da wolle. Er ist eigentlich dazu gedacht aufzuräumen falls nötig wenn eine Exception gefangen wurde.
Schau mal hier: http://java.sun.com/docs/books/tutorial/essential/exceptions/

Gruß,
stengbiegel
 
Boron schrieb:
Mal ganz naiv:
Um jeden einzelnen Aufruf von a() einen try/catch-Block machen?

Ist a() wirklich eine static Funktion?
Gibt a() nichts zurück?
Aber das nur am Rande.


das mit den einzelnen try Ctach Blöcken war absoluter Schwachsinn von mir.
a ist wirklich static und gibt was zurück, und zwar ein Array vom Typ int.
Übergeben kriegt a ebenfalls ein Array vom Typ int.

Der Sinn dieser Methode ist es, das übergebene Array zu durchsuchen und bestimmte Werte in das neue Array zu packen und dieses dann auszugeben.
 
stengbiegel schrieb:
Hi,
du kannt jeden einzelnen Aufruf in einen try/catch Block packen. Wenn eine Exception fliegt, dann solltest du sie fangen und behandeln. Ob dein Programm danach weiterlaufen kann/soll musst du entscheiden. Schliesslich zeiget eine Exception einen Ausnahmezustand an, der vermutlich behandelt werden sollte.

Gruß,
stengbiegel


Ich habe in der Methode z.B. folgenden Code:

if(z == null){

throw new IllegalArgumentException("Keine Matrix vorhanden!!");
}

wobei z die übergebene Matrix ist.
Wie könnte ich denn verhindern, dass das Programm an dieser Stelle komplett terminiert.
Mein Wunsch wäre hier, dass aus der main heraus diese Methode nochmals aber halt mit einem anderen array aufgerufen wird.
 
Helios co. schrieb:
Wie könnte ich denn verhindern, dass das Programm an dieser Stelle komplett terminiert.
Mein Wunsch wäre hier, dass aus der main heraus diese Methode nochmals aber halt mit einem anderen array aufgerufen wird.

na das sollte doch gehen, wenn du die Exceptions fängst. Ich frage mich, woran du da scheiterst. Vielleicht postest du mal den Code, falls du damit Schwierigkeiten hast.
Den Test auf matrix == null kannst du ja auch schon im main() machen, das spart einiges. komplexere Tests in einer Hilfsmethode, auch aus main() aufrufbar und gut isses.

Gruß,
stengbiegel
 
Helios co. schrieb:
Ich habe in der Methode z.B. folgenden Code:

if(z == null){

throw new IllegalArgumentException("Keine Matrix vorhanden!!");
}

wobei z die übergebene Matrix ist.
Wie könnte ich denn verhindern, dass das Programm an dieser Stelle komplett terminiert.
Mein Wunsch wäre hier, dass aus der main heraus diese Methode nochmals aber halt mit einem anderen array aufgerufen wird.

Hmm, eine Exception ist ja eine Ausnahmesituation. So, wie du es hier schilderst, hört sich das bei dir an, als würdest du schon davon ausgehen, dass dieser Fall eintritt. Dann aber hätte das Programm einen viel grundlegenderen Fehler oder ist sehr unsauber geschrieben.

Du solltest dir vielleicht einmal anschauen, wie es überhaupt dazu kommt, dass z = null ist. Beruht es z.B. auf einer falschen Benutzereingabe, dann behebe den Fehler schon dort, z.B. eine Schleife um die Eingabe, die erst dann durchlässt, wenn die Eingabe in Ordnung ist.
 
Code:
static int[][] transponiere(int[][] m){
		
		//Prüft ob eine Matrix vorhanden ist
		if(m == null){

			throw new IllegalArgumentException("Keine Matrix vorhanden!!");
		}
		
		
		
		//Bestimmt, ob es leere Zeilen gibt
		for(int zaehler=0; zaehler<m.length; zaehler++) {
			   if(m[zaehler].length == 0){

				   throw new IllegalArgumentException("Es fehlt mindestens eine Zeile!!");
			   }
		}
		
		//Prüft ob es Lücken in den Zeilen gibt
		int maxLineValue = m[0].length;
		for(int i = 0; i < m.length; i++){
			for(int j = 0; j < m[i].length; j++){
				if(maxLineValue < m[i].length || maxLineValue > m[i].length){

					throw new IllegalArgumentException("Matrix ist nicht rechteckig!!");
				}
			}
		}
		
		//Transponieren der Matrix (vertauschen von Zeilen und Spalten) 
		int zeilen = m.length;
		int spalten = m[0].length;
		
		int[][] matrix = new int[spalten][zeilen];

		
		for(int i = 0; i < zeilen; i++){
			for(int j = 0; j < spalten; j++){
				matrix[j][i] = m[i][j];
			}
		}
		
		
		return matrix;
	}
	
	
	
	
	/**
	 * main
	 */
	public static void main(String[] args){
	
		
		int[][] m1 = {{11,12,13,14,15},{21,22,23,24,25},{31,32,33,34,35}};
		int[][] m2 = {{11,12},{21,22},{31,32},{41,42}};
		int[][] m3 = {{11}};
		int[][] m4 = {{}};
		int[][] m5 = {{11,12,13,14,15},{21,22,23,24},{31,32,33,34,35}};
		int[][] m6 = {{11,12},{21,22},null,{41,42}};
		int[][] m7 = null;
			

			System.out.println("m1 normal:");
			print(m1);
			System.out.println("m1 transponiert:");
			print(transponiere(m1));
	
			System.out.println("m2 normal:");
			print(m2);
			System.out.println("m2 transponiert:");
			print(transponiere(m2));
	
			System.out.println("m3 normal:");
			print(m3);
			System.out.println("m3 transponiert:");
			print(transponiere(m3));
	
			System.out.println("m4 normal:");
			print(m4);
			System.out.println("m4 transponiert:");
			print(transponiere(m4));
		
			System.out.println("m5 normal:");
			print(m5);
			System.out.println("m5 transponiert:");
			print(transponiere(m5));
	
			System.out.println("m6 normal:");
			print(m6);
			System.out.println("m6 transponiert:");
			print(transponiere(m6));
	
			System.out.println("m7 normal:");
			print(m7);
			System.out.println("m7 transponiert:");
			print(transponiere(m7));
	
		
		
	}

}


Das wäre der code.
Ich habe halt mehrere Testfälle und für manche davon werden halt Exceptions geworfen.

Gewünscht ist, dass die jeweilige Exception auch "erklärt" wird...
 
Code:
   System.out.println("m1 normal:");
   print(m1);
   System.out.println("m1 transponiert:");
   try {
      print(transponiere(m1));
   }
   catch( Exception e)
   {
      // gewünschte Ausnahmebehandlung
   }
So sollte dein Programm eigentlich nicht sofort beenden.

Falls doch, vielleicht hat es damit zu tun, dass transponiere() eine static Methode ist.
 
Code:
for(int i = 0; i < 5; i++){
			try{
				switch(i){
				
				case 0: System.out.println("m1 normal:");
						print(m1);
						System.out.println("m1 transponiert:");
						print(transponiere(m1));
						
				case 1: System.out.println("m2 normal:");
						print(m2);
						System.out.println("m2 transponiert:");
						print(transponiere(m2));
						
				case 2: System.out.println("m3 normal:");
						print(m3);
						System.out.println("m3 transponiert:");
						print(transponiere(m3));
						
				case 3: System.out.println("m4 normal:");
						print(m4);
						System.out.println("m4 transponiert:");
						print(transponiere(m4));
				
				case 4: System.out.println("m5 normal:");
						print(m5);
						System.out.println("m5 transponiert:");
						print(transponiere(m5));
				
				case 5: System.out.println("m6 normal:");
						print(m6);
						System.out.println("m6 transponiert:");
						print(transponiere(m6));
						
				case 6: System.out.println("m7 normal:");
						print(m7);
						System.out.println("m7 transponiert:");
						print(transponiere(m7));
					
				
			}
		}
		catch(Exception e){
			
		}

Das wäre meine Alternative gewesen, nur hier wäre halt noch das Problem, dass die Exceptionmeldung nicht weitergereicht werden würde.
Wenn ich mich nicht irre, geschieht das in deiner Version auch nicht..ich probiere es aber gleich mal.
 
An wen willst du die Exception weiterreichen?
Die kommt von transponiere() direkt nach main(). Darunter gibt es niemanden mehr!

PS:
mit i < 5 in der for-Schleife sind case 5 und 6 toter Code und nicht erreichbar ;).

Und, hey, wo sind die break-Anweisungen nach deinen cases? Die sind ganz wichtig!
 
Zuletzt bearbeitet:
Stimmt, waren ja 7 Testfälle :D

Die spezifischen Exceptions sollen auf der Console augegeben werden.
Im Moment werden die das nicht, sondern nur die (Exception e){"bla"};
 
Alle Exceptions sind von Excpetion abgeleitet (Stichwort Polymorphie).
Du kannst also im catch-BLock die Excpetion e nehmen und deren Fehlermeldung, z.B. "Keine Matrix vorhanden", auslesen und ausgeben.

Oder du machst was raffiniertes. Mehrere catch-Blöcke ;):
Code:
try {
   // dein wildes Zeug
}
catch( IllegalArgumentException e1 )
{
   // hier speziell für IllegalArgumentExceptions
}
catch( Excpetion e2 )
{
   // hier für alle nicht speziell behandelten Excpetions
}
So kannst du verschiedene Fehlerbehandlungen durchführen.
Und dann schaust du mal in der API-Doku zu Java wie du aus den Excpetions deine Nachricht extrahierst. Da gibt es eine Methode für.

Und nicht die break-Anweisungen vergessen!!!
 
Zurück
Oben