Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

DVG2 - 041 Ausnahmen. DVG2 - 042 Was sind Programmfehler? 4 Programm erzielt gar kein Ergebnis. 4 Berechnetes Ergebnis stimmt nicht mit dem erwarteten.

Ähnliche Präsentationen


Präsentation zum Thema: "DVG2 - 041 Ausnahmen. DVG2 - 042 Was sind Programmfehler? 4 Programm erzielt gar kein Ergebnis. 4 Berechnetes Ergebnis stimmt nicht mit dem erwarteten."—  Präsentation transkript:

1 DVG2 - 041 Ausnahmen

2 DVG2 - 042 Was sind Programmfehler? 4 Programm erzielt gar kein Ergebnis. 4 Berechnetes Ergebnis stimmt nicht mit dem erwarteten überein. 4 Programm verhält sich falsch oder unzweckmäßig während der Abarbeitung, z.B.: –Absturz bei falscher Eingabe –unendliche Zyklen bei fehlerhaften Parametern –kein Ende bei bestimmten Aufgaben –Programm arbeitet nicht reproduzierbar falsch

3 DVG2 - 043 Fehlerursachen 4 fehlerhafte Konzeption 4 fehlerhafter Algorithmus 4 fehlerhafte Syntax 4 fehlerhafte Realisierung der Konzeption bzw. des Algorithmus 4 fehlerhafte Bedienung bzw. fehlerhafte Parameter 4 Fehler innerhalb der VM 4 fehlerhaftes Betriebssystem 4 fehlerhafte Hardware

4 DVG2 - 044 Ausnahmen in JAVA 4 Befassen sich mit Fehlern, die zur Ausführungszeit eines Programms auftreten. Z.B.: –Ein-/Ausgabe-Fehler, z.B.: Lesefehler bei System.in.read(buffer); –Laufzeitfehler, z.B.: int i = Integer.parseInt(args[0]); führt bei args[0]=="abc" zu einer Ausnahme " N umberFormatException" –arithmetische Fehler, z.B.: int i = 1/0; führt zu einer Ausnahme "ArithmeticException" 4 JAVA bietet komfortable aber einfache Möglichkeiten zur Behandlung von Ausnahmen.

5 DVG2 - 045 public class test1 { public static void main ( String [] args) { int i = Integer.parseInt(args[0]); System.out.println("Es wurde der Wert "+i+" eingegeben."); } } "java test1 11234" ergibt: Es wurde der Wert 11234 eingegeben. "java test1 11234xx" ergibt: Exception in thread "main" java.lang.NumberFormatException: 11234xx at java.lang.Integer.parseInt(Compiled Code) at java.lang.Integer.parseInt(Integer.java:458) at test1.main(test1.java:5)

6 DVG2 - 046 Fehlerursache: 11234xx läßt sich nicht in eine int-Größe umwandeln! 4 Compilermeldung exakt und hilfreich für den Programmentwickler 4 Der Anwender wird durch die Meldung verunsichert und erfährt nicht, was er falsch gemacht hat. 4 Typischer Anruf des Anwenders: Ich habe alles genau so gemacht wie immer, aber seit heute funktioniert nichts mehr. Was ist los?

7 DVG2 - 047 public class test2 { public static void main ( String [] args) { try { int i = Integer.parseInt(args[0]); System.out.println("Es wurde der Wert "+i+" eingegeben."); } catch (NumberFormatException e) { System.out.println(args[0]+ " kann nicht in eine int-Groesse verwandelt werden!\n"+ "Der Parameter darf nur aus Ziffern 0..9 bestehen!"); } } } "java test2 11234" ergibt: Es wurde der Wert 11234 eingegeben. "java test2 11234xx" ergibt: 11234xx kann nicht in eine int-Groesse verwandelt werden! Der Parameter darf nur aus Ziffern 0..9 bestehen! "java test2" ergibt: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 at test2.main(test2.java:7)

8 DVG2 - 048 public class test3 { public static void main ( String [] args) { try { int i = Integer.parseInt(args[0]); System.out.println("Es wurde der Wert "+i+" eingegeben."); } catch (NumberFormatException e) { System.out.println(args[0]+ " kann nicht in eine int-Groesse verwandelt werden!\n"+ "Der Parameter darf nur aus Ziffern 0..9 bestehen!"); } catch (ArrayIndexOutOfBoundsException e) { System.out.println( "Es muss mindestens ein Parameter angegeben werden!"); } } } "java test3" ergibt: Es muss mindestens ein Parameter angegeben werden!

9 DVG2 - 049 public class test4 { public static void main ( String [] args){ try { int i = Integer.parseInt(args[0]); System.out.println("Es wurde der Wert "+i+" eingegeben."); } catch (NumberFormatException e) { System.out.println(args[0]+ " kann nicht in eine int-Groesse verwandelt werden!\n"+ "Der Parameter darf nur aus Ziffern 0..9 bestehen!"); } catch (ArrayIndexOutOfBoundsException e) { System.out.println( "Es muss mindestens ein Parameter angegeben werden!"); } finally { System.out.println( "Das Programm ist mehr oder weniger erfolgreich beendet."); } } Egal wie das Programm beendet wird es gibt die Meldung aus: Das Programm ist mehr oder weniger erfolgreich beendet.

10 DVG2 - 0410 Allgemeine Form try { // Block in dem Ausnahmen auftreten können } catch (Ausnahmetyp1 name) { // Block in dem der Ausnahmetyp1 behandelt wird }... catch (AusnahmetypN name) { // Block in dem der AusnahmetypN behandelt wird } finally { // finally- Block }

11 DVG2 - 0411 4 Nach einem try-Block muß immer mindestens ein catch-Block existieren. 4 Beim Eintreten einer Ausnahme wird der erste passende catch-Block abgearbeitet. 4 Der finally-Block muß immer nach allen catch-Blöcken stehen. 4 Der finally-Block wird abgearbeitet: –nach dem normalen Ende des try-Blockes –nach einer behandelten Ausnahme –vor einer Ausnahme, die weitergereicht wird –nach Verlassen des try-Blockes über eine break-, continue- oder return-Anweisung

12 DVG2 - 0412 try-BlockAusnahme Ausnahmetyp1 Catch-Block 1 AusnahmetypN Catch-Block N Ausnahmetyp2 Catch-Block 2 finally-Block

13 DVG2 - 0413 public class test5 { public static void main (String [] args) { System.out.println("Gebe bitte eine Zeichenkette ein : "); byte [] buffer = new byte [80]; int ir=0; ir = System.in.read(buffer); if ((char)buffer[ir-1]=='\n') ir--; if ((char)buffer[ir-1]=='\r') ir--; String s = new String(buffer,0,ir); System.out.println("Es wurde eingegeben :\n\""+s+"\""); } } javac test5.java ergibt test5.java:8: Exception java.io.IOException must be caught, or it must be declared in the throws clause of this method. System.in.read(buffer);

14 DVG2 - 0414 public class test6 { public static void main (String [] args) { System.out.println("Gebe bitte eine Zeichenkette ein : "); byte [] buffer = new byte [80]; int ir=0; try { ir = System.in.read(buffer); if ((char)buffer[ir-1]=='\n') ir--; if ((char)buffer[ir-1]=='\r') ir--; } catch (java.io.IOException e) { } String s = new String(buffer,0,ir); System.out.println("Es wurde eingegeben :\n\""+s+"\""); } } java test6 ergibt Gebe bitte eine Zeichenkette ein : Das ist ein Test. Es wurde eingegeben : "Das ist ein Test."

15 DVG2 - 0415 geprüft bzw. ungeprüfte Ausnahmen Ausnahmen NumberFormatException und ArrayIndexOutOfBoundsException brauchten nicht abgefangen zu werden, d.h. es mußte keine catch-Anweisung für diese Ausnahmen angegeben werden. ==> ungeprüfte Ausnahmen Ausnahme java.io.IOException mußte abgefangen werden. ==> geprüfte Ausnahmen

16 DVG2 - 0416 Throwable Error ungeprüft IOException geprüft RuntimeException ungeprüft Exception geprüftungeprüft Eigene Ausnahmen nicht empfohlen Eigene Ausnahmen meist benutzt Eigene Ausnahmen möglich Eigene Ausnahmen nicht empfohlen Ausnahmenhierarchie

17 DVG2 - 0417 Weiterreichen von Ausnahmen 4 Eine Ausnahme muß nicht in der Methode behandelt werden, in der sie auftritt. Sie kann auch an die aufrufende Methode weitergereicht werden. 4 Das wird dem Compiler durch die throws-Klausel einer Methoden- Deklaration mitgeteilt, z.B.: public static String readString() throws java.io.IOException

18 DVG2 - 0418 public class test7 { public static String readString() { byte [] buffer = new byte [80]; try { int ir = System.in.read(buffer); if ((char)buffer[ir-1]=='\n') ir--; if ((char)buffer[ir-1]=='\r') ir--; return new String(buffer,0,ir); } catch (java.io.IOException e) { return null; } } public static void main (String [] args) { System.out.println("Gebe bitte eine Zeichenkette ein : "); System.out.println( "Es wurde eingegeben :\n\""+readString()+"\""); } }

19 DVG2 - 0419 public class test8 { public static String readString() throws java.io.IOException { byte [] buffer = new byte [80]; int ir = System.in.read(buffer); if ((char)buffer[ir-1]=='\n') ir--; if ((char)buffer[ir-1]=='\r') ir--; return new String(buffer,0,ir); } public static void main (String [] args) throws java.io.IOException { System.out.println("Gebe bitte eine Zeichenkette ein : "); System.out.println( "Es wurde eingegeben :\n\""+readString()+"\""); } }

20 DVG2 - 0420 Auslösen von Ausnahmen 4 Ausnahmen können durch das Programm ausgelöst werden, durch throw new Ausnahme (...);

21 DVG2 - 0421 public class test9 { public static void main (String [] args) { int z = Integer.parseInt(args[0]); int n = Integer.parseInt(args[1]); if ( n == 0) { System.out.println("Der Nenner ist == 0 !"); throw new ArithmeticException("Nenner ist 0"); } else { System.out.println(z+"/"+n+"="+z/n); } } } java test9 1 0 ergibt Der Nenner ist == 0 ! Exception in thread "main" java.lang.ArithmeticException: Nenner ist 0 at test9.main(test9.java:11)

22 DVG2 - 0422 Eigene Ausnahmen 4 Ausnahmen sind Klassen, die von anderen Ausnahmeklassen abgeleitet sind. 4 Einfachste Form: class Ausnahme extends OberKlasse { } z.B.: class Ausnahme extends Exception { }

23 DVG2 - 0423 public class test10 { public static int f ( int z, int n ) throws Ausnahme { if ( n == 0 ) { throw new Ausnahme(); } return z/n; } public static void main (String [] args) { int z = Integer.parseInt(args[0]); int n = Integer.parseInt(args[1]); try { System.out.println(z+"/"+n+"="+f(z,n)); } catch (Ausnahme e) { System.out.println(e); } } } class Ausnahme extends Exception { } java test10 10 0 ergibt Ausnahme

24 DVG2 - 0424 4 Für eigene Ausnahmen sollten die Konstruktoren definiert werden, da nur der leere Konstruktor automatisch erzeugt wird. public class Ausnahme extends Exception { Ausname() { super() } Ausnahme(String message) { super(message) } } 4 Bei dieser Form kann eine Nachrichtentext den Fehler genauer erläutern bzw. lokalisieren.

25 DVG2 - 0425 Beispiel : Skalarprodukt static double ScalarProduct(double [] x, double [] y) { double sp=0.0; for (int i=0;i<x.length;i++) sp+=x[i]*y[i]; return sp; }

26 DVG2 - 0426 Zusammenfassung Aktivieren von Ausnahmen throw new NameDerAusnahme ("Fehlermeldung",...);

27 DVG2 - 0427 static double ScalarProduct(double [] x, double [] y) { if (x==null) throw new NullPointerException("erster Parameter null"); if (y==null) throw new NullPointerException("zweiter Parameter null"); double sp=0.0; for (int i=0;i<x.length;i++) sp+=x[i]*y[i]; return sp; }

28 DVG2 - 0428 Definition von Ausnahmen [public] class NameDerAusnahme extends Exception { NameDerAusnahme() { super(); } NameDerAusnahme(String message) { super(message); } [weitere Konstruktoren, Attribute, Methoden] }

29 DVG2 - 0429 Beispiel : eigene Ausnahme public class DimensionException extends Exception { DimensionException() { super(); } DimensionException(String message) { super(message); }

30 DVG2 - 0430 static double ScalarProduct(double [] x, double [] y) { if (x==null) throw new NullPointerException("erster Parameter null"); if (y==null) throw new NullPointerException("zweiter Parameter null"); if (x.length != y.length) throw new DimensionException ( "Ungleiche Dimension der Felder im Skalarprodukt"); double sp=0.0; for (int i=0;i<x.length;i++) sp+=x[i]*y[i]; return sp; }

31 DVG2 - 0431 Weiterreichen von Ausnahmen... NamederMethode (...) throws NameDerAusnahme1, NameDerAusnahme2,..., NameDerAusnahmeN

32 DVG2 - 0432 static double ScalarProduct(double [] x, double [] y) throws DimensionException { if (x==null) throw new NullPointerException("erster Parameter null"); if (y==null) throw new NullPointerException("zweiter Parameter null"); if (x.length != y.length) throw new DimensionException ( "Ungleiche Dimension der Felder im Skalarprodukt"); double sp=0.0; for (int i=0;i<x.length;i++) sp+=x[i]*y[i]; return sp; }

33 DVG2 - 0433 Beispiel : Matrix x Vektor static double [] MatrixVektor(double[][]A, double[]x) { double [] y = new double[A.length]; for (int i=0;i<y.length;i++) { y[i]=ScalarProduct(A[i],x); } return y; }

34 DVG2 - 0434 Abfangen von Ausnahmen try { // Anweisungen im try-Block } catch (NameDerAusnahme1 e) { // Anweisungen im ersten catch-Block }... catch (NameDerAusnahmeN e) { // Anweisungen im N-ten catch-Block } finally { // Anweisungen im finally-Block }

35 DVG2 - 0435 Beispiel : Matrix x Vektor static double [] MatrixVektor(double[][]A, double[]x) throws DimensionException { if (A==null) throw new NullPointerException("erster Parameter null"); if (x==null) throw new NullPointerException("zweiter Parameter null"); double [] y = new double[A.length]; for (int i=0;i<y.length;i++) { if (A[i]==null) throw new NullPointerException("Matrixzeile "+i+" gleich null"); try { y[i]=ScalarProduct(A[i],x); } catch (DimensionException e) {throw new DimensionException ("Falsche Dimension in Zeile +i);} } return y; }

36 DVG2 - 0436 static double ScalarProduct(double [] x, double [] y) throws DimensionError { try { if (x.length != y.length) throw new DimensionError("Ungleiche Dimension der Felder im Skalarprodukt"); double sp=0.0; for (int i=0;i<x.length;i++) sp+=x[i]*y[i]; return sp; } catch (NullPointerException e) { if(x==null)throw new NullPointerException("erster Parameter null"); if(y==null)throw new NullPointerException("zweiter Parameter null"); return 0; }

37 DVG2 - 0437 static double [] MatrixVektor(double[][]A, double[]x) throws DimensionError { int i = 0; try { double [] y = new double[A.length]; for (i=0;i<y.length;i++) y[i]=ScalarProduct(A[i],x); return y; }

38 DVG2 - 0438 catch (DimensionException e) { throw new DimensionException ("Falsche Dimension in Zeile "+i); } catch (NullPointerException e) { if (A==null) throw new NullPointerException("erster Parameter null"); if (x==null) throw new NullPointerException("zweiter Parameter null"); if (A[i]==null) throw new NullPointerException( "Matrixzeile "+i+" gleich null"); } return null; }


Herunterladen ppt "DVG2 - 041 Ausnahmen. DVG2 - 042 Was sind Programmfehler? 4 Programm erzielt gar kein Ergebnis. 4 Berechnetes Ergebnis stimmt nicht mit dem erwarteten."

Ähnliche Präsentationen


Google-Anzeigen