Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

DVG1 - Ausnahmen1 Ausnahmen. DVG1 - Ausnahmen2 Was sind Programmfehler? n Programm erzielt gar kein Ergebnis. n Berechnetes Ergebnis stimmt nicht mit.

Ähnliche Präsentationen


Präsentation zum Thema: "DVG1 - Ausnahmen1 Ausnahmen. DVG1 - Ausnahmen2 Was sind Programmfehler? n Programm erzielt gar kein Ergebnis. n Berechnetes Ergebnis stimmt nicht mit."—  Präsentation transkript:

1 DVG1 - Ausnahmen1 Ausnahmen

2 DVG1 - Ausnahmen2 Was sind Programmfehler? n Programm erzielt gar kein Ergebnis. n Berechnetes Ergebnis stimmt nicht mit dem erwarteten überein. n 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 DVG1 - Ausnahmen3 Fehlerursachen n fehlerhafte Konzeption n fehlerhafter Algorithmus n fehlerhafte Syntax n fehlerhafte Realisierung der Konzeption bzw. des Algorithmus n fehlerhafte Bedienung bzw. fehlerhafte Parameter n Fehler innerhalb der VM n fehlerhaftes Betriebssystem n fehlerhafte Hardware

4 DVG1 - Ausnahmen4 Ausnahmen in JAVA n 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" n JAVA bietet komfortable aber einfache Möglichkeiten zur Behandlung von Ausnahmen.

5 DVG1 - Ausnahmen5 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 test " ergibt: Es wurde der Wert eingegeben. "java test xx" 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 DVG1 - Ausnahmen6 Fehlerursache: 11234xx läßt sich nicht in eine int-Größe umwandeln! n Compilermeldung exakt und hilfreich für den Programmentwickler n Der Anwender wird durch die Meldung verunsichert und erfährt nicht, was er falsch gemacht hat. n Typischer Anruf des Anwenders: „Ich habe alles genau so gemacht wie immer, aber seit heute funktioniert nichts mehr. Was ist los?“

7 DVG1 - Ausnahmen7 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 test " ergibt: Es wurde der Wert eingegeben. "java test xx" 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 DVG1 - Ausnahmen8 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 DVG1 - Ausnahmen9 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 DVG1 - Ausnahmen10 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 DVG1 - Ausnahmen11 n Nach einem try-Block muß immer mindestens ein catch-Block existieren. n Beim Eintreten einer Ausnahme wird der erste passende catch-Block abgearbeitet. n Der finally-Block muß immer nach allen catch-Blöcken stehen. n 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 DVG1 - Ausnahmen12 try-BlockAusnahme Ausnahmetyp1 Catch-Block 1 AusnahmetypN Catch-Block N Ausnahmetyp2 Catch-Block 2 finally-Block

13 DVG1 - Ausnahmen13 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 DVG1 - Ausnahmen14 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 DVG1 - Ausnahmen15 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 DVG1 - Ausnahmen16 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 DVG1 - Ausnahmen17 Weiterreichen von Ausnahmen n Eine Ausnahme muß nicht in der Methode behandelt werden, in der sie auftritt. Sie kann auch an die aufrufende Methode weitergereicht werden. n Das wird dem Compiler durch die throws-Klausel einer Methoden- Deklaration mitgeteilt, z.B.: public static String readString() throws java.io.IOException

18 DVG1 - Ausnahmen18 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 DVG1 - Ausnahmen19 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 DVG1 - Ausnahmen20 Auslösen von Ausnahmen n Ausnahmen können durch das Programm ausgelöst werden, durch throw new Ausnahme (...);

21 DVG1 - Ausnahmen21 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 DVG1 - Ausnahmen22 Eigene Ausnahmen n Ausnahmen sind Klassen, die von anderen Ausnahmeklassen abgeleitet sind. n Einfachste Form: class Ausnahme extends OberKlasse { } z.B.: class Ausnahme extends Exception { }

23 DVG1 - Ausnahmen23 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 test ergibt Ausnahme

24 DVG1 - Ausnahmen24 Lesemethoden n Was wollen wir einlesen? –Zeichenketten, Texte –numerische Daten ganze Zahlen (byte, short, int, long) Gleitkommazahlen (float, double) –Felder –Auswahlen, Menüs

25 DVG1 - Ausnahmen25 Einlesen von Zeichenketten n Probleme: –Eingabe ist gepuffert –es können beliebig lange Texte gelesen werden –Externe Darstellung von Zeichen im ASCII-Code –Interne Darstellung der Zeichen im Unicode n Möglichkeiten: –System.in.read(buffer,off,len) Lesen in byte -Puffer –System.in.available() wieviele Zeichen sind noch im Eingabepuffer –String(buffer,off,len) Umwandeln von ASCII-Zeichen in Unicode-Zeichen

26 DVG1 - Ausnahmen26 public static String readString() { try { byte [] buffer = new byte [80]; int ir = System.in.read(buffer); return new String(buffer,0,ir); } catch ( java.io.IOException e) { e.printStackTrace(); System.exit(1); return null; } }

27 DVG1 - Ausnahmen27 public static String readString() { try { byte [] buffer = new byte [80]; int ir = System.in.read(buffer); while ( (ir>0) && (buffer[ir-1]=='\n') | (buffer[ir-1]=='\r') ) ir--; return new String(buffer,0,ir); } catch ( java.io.IOException e) { e.printStackTrace(); System.exit(1); return null; }

28 DVG1 - Ausnahmen28 public static String readString() { try { byte [] buffer = new byte [80]; int ir = System.in.read(buffer); if ( ir<=0 ) return ""; while ( (ir>0) && (buffer[ir-1]=='\n') | (buffer[ir-1]=='\r') ) ir--; return new String(buffer,0,ir); } catch ( java.io.IOException e) { e.printStackTrace(); System.exit(1); return null; }

29 DVG1 - Ausnahmen29 public static String readString() { try { byte [] buffer = new byte [80]; int ir = System.in.read(buffer); if ( ir<=0 ) return ""; int ir2 = System.in.available(); if ( ir2>0 ) { byte [] sbuf = buffer; buffer = new byte [sbuf.length+ir2]; for (int i=0; i0) && (buffer[ir-1]=='\n') | (buffer[ir-1]=='\r') ) ir--; return new String(buffer,0,ir); } catch ( java.io.IOException e) { e.printStackTrace(); System.exit(1); return null; }

30 DVG1 - Ausnahmen30 public static double readDouble ( ) { for (;;) { try { String s = readString(); return Double.parseDouble(s); } catch ( NumberFormatException e ) { System.out.print("Nochmal:"); } }}

31 DVG1 - Ausnahmen31 public static double readDouble ( ) { for (;;) { try { String s = readString(); if ( s.compareToIgnoreCase("nan")==0 ) return 0.0/0.0; return Double.parseDouble(s); } catch ( NumberFormatException e ) { System.out.print("Nochmal:"); } }}

32 DVG1 - Ausnahmen32 public static double readDouble ( double def ) { for (;;) { try { String s = readString(); if ( s.compareToIgnoreCase("nan")==0 ) return 0.0/0.0; if ( s.length() == 0 ) return def; return Double.parseDouble(s); } catch ( NumberFormatException e ) { System.out.print("Nochmal:"); } }}

33 DVG1 - Ausnahmen33 public static double readDouble ( String prompt, double def, String colon) { System.out.print(prompt+" ["+def+"] "+colon); for (;;) { try { String s = readString().trim(); if ( s.compareToIgnoreCase("nan")==0 ) return 0.0/0.0; if ( s.length() == 0 ) return def; return Double.parseDouble(s); } catch ( NumberFormatException e ) { System.out.print("Nochmal ["+def+"] "+colon); } }}

34 DVG1 - Ausnahmen34 public static double readDouble ( String prompt, String errorMessage, double def, String colon) { System.out.print(prompt+" ["+def+"] "+colon); for (;;) { try { String s = readString().trim(); if ( s.compareToIgnoreCase("nan")==0 ) return 0.0/0.0; if ( s.length() == 0 ) return def; return Double.parseDouble(s); } catch ( NumberFormatException e ) { System.out.print(errorMessage+" ["+def+"] "+colon); } }}

35 DVG1 - Ausnahmen35 public static double readDouble ( String prompt, String errorMessage, double def, String colon) { String helpText = "Geben Sie bitte eine double-Groesse ein.\n"+ "Die Eingabe darf aus den Ziffern 0..9 bestehen. Ausserdem koennen\n"+ "ein Dezimalpunkt, das Zeichen \"E\" fuer den Exponenten,\n"+ "sowie Vorzeichen vor der Zahl und dem Exponenten angegeben werden.\n"+ "NaN erhaelt man durch Eingaben von \"NaN\".\nz.B.: E-123"; System.out.print(prompt+"(?=help) ["+def+"] "+colon); for (;;) { try { String s = readString().trim(); if ( s.compareTo("?")==0 ) { System.out.println(helpText); System.out.print(prompt+"(?=help) ["+def+"] "+colon); continue; } if ( s.compareToIgnoreCase("nan")==0 ) return 0.0/0.0; if ( s.length() == 0 ) return def; return Double.parseDouble(s); } catch ( NumberFormatException e ) { System.out.print(errorMessage+"(?=help) ["+def+"] "+colon); } }}


Herunterladen ppt "DVG1 - Ausnahmen1 Ausnahmen. DVG1 - Ausnahmen2 Was sind Programmfehler? n Programm erzielt gar kein Ergebnis. n Berechnetes Ergebnis stimmt nicht mit."

Ähnliche Präsentationen


Google-Anzeigen