31
DVG1 - 11 - Ausnahmen 1 Ausnahmen

DVG1 - 11 - Ausnahmen1 Ausnahmen. DVG1 - 11 - Ausnahmen 2 Was sind Programmfehler? Programm erzielt gar kein Ergebnis. Berechnetes Ergebnis stimmt nicht

Embed Size (px)

Citation preview

Page 1: DVG1 - 11 - Ausnahmen1 Ausnahmen. DVG1 - 11 - Ausnahmen 2 Was sind Programmfehler? Programm erzielt gar kein Ergebnis. Berechnetes Ergebnis stimmt nicht

DVG1 - 11 - Ausnahmen 1

Ausnahmen

Page 2: DVG1 - 11 - Ausnahmen1 Ausnahmen. DVG1 - 11 - Ausnahmen 2 Was sind Programmfehler? Programm erzielt gar kein Ergebnis. Berechnetes Ergebnis stimmt nicht

DV

G1

- 11 - A

usn

ahm

en

2

Was sind Programmfehler?

Programm erzielt gar kein Ergebnis. Berechnetes Ergebnis stimmt nicht mit dem erwarteten überein. 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

Page 3: DVG1 - 11 - Ausnahmen1 Ausnahmen. DVG1 - 11 - Ausnahmen 2 Was sind Programmfehler? Programm erzielt gar kein Ergebnis. Berechnetes Ergebnis stimmt nicht

DV

G1

- 11 - A

usn

ahm

en

3

Fehlerursachen

fehlerhafte Konzeption fehlerhafter Algorithmus fehlerhafte Syntax fehlerhafte Realisierung der Konzeption bzw. des Algorithmus fehlerhafte Bedienung bzw. fehlerhafte Parameter Fehler innerhalb der VM fehlerhaftes Betriebssystem fehlerhafte Hardware

Page 4: DVG1 - 11 - Ausnahmen1 Ausnahmen. DVG1 - 11 - Ausnahmen 2 Was sind Programmfehler? Programm erzielt gar kein Ergebnis. Berechnetes Ergebnis stimmt nicht

DV

G1

- 11 - A

usn

ahm

en

4

Ausnahmen in JAVA 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 "NumberFormatException"

arithmetische Fehler, z.B.:

int i = 1/0;

führt zu einer Ausnahme "ArithmeticException" JAVA bietet komfortable und dennoch einfache Möglichkeiten zur

Behandlung von Ausnahmen.

Page 5: DVG1 - 11 - Ausnahmen1 Ausnahmen. DVG1 - 11 - Ausnahmen 2 Was sind Programmfehler? Programm erzielt gar kein Ergebnis. Berechnetes Ergebnis stimmt nicht

DV

G1

- 11 - A

usn

ahm

en

5

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)

Page 6: DVG1 - 11 - Ausnahmen1 Ausnahmen. DVG1 - 11 - Ausnahmen 2 Was sind Programmfehler? Programm erzielt gar kein Ergebnis. Berechnetes Ergebnis stimmt nicht

DV

G1

- 11 - A

usn

ahm

en

6

Fehlerursache: 11234xx lässt sich nicht in eine int-Größe umwandeln!

Compilermeldung exakt und hilfreich für den Programmentwickler. Der Anwender wird durch die Meldung verunsichert und erfährt nicht,

was er falsch gemacht hat. Typischer Anruf des Anwenders: „Ich habe alles genau so gemacht

wie immer, aber seit heute funktioniert nichts mehr. Was ist los?“

Page 7: DVG1 - 11 - Ausnahmen1 Ausnahmen. DVG1 - 11 - Ausnahmen 2 Was sind Programmfehler? Programm erzielt gar kein Ergebnis. Berechnetes Ergebnis stimmt nicht

DV

G1

- 11 - A

usn

ahm

en

7

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)

Page 8: DVG1 - 11 - Ausnahmen1 Ausnahmen. DVG1 - 11 - Ausnahmen 2 Was sind Programmfehler? Programm erzielt gar kein Ergebnis. Berechnetes Ergebnis stimmt nicht

DV

G1

- 11 - A

usn

ahm

en

8

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!

Page 9: DVG1 - 11 - Ausnahmen1 Ausnahmen. DVG1 - 11 - Ausnahmen 2 Was sind Programmfehler? Programm erzielt gar kein Ergebnis. Berechnetes Ergebnis stimmt nicht

DV

G1

- 11 - A

usn

ahm

en

9

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.

Page 10: DVG1 - 11 - Ausnahmen1 Ausnahmen. DVG1 - 11 - Ausnahmen 2 Was sind Programmfehler? Programm erzielt gar kein Ergebnis. Berechnetes Ergebnis stimmt nicht

DV

G1

- 11 - A

usn

ahm

en

10

Allgemeine Formtry{// 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 }

Page 11: DVG1 - 11 - Ausnahmen1 Ausnahmen. DVG1 - 11 - Ausnahmen 2 Was sind Programmfehler? Programm erzielt gar kein Ergebnis. Berechnetes Ergebnis stimmt nicht

DV

G1

- 11 - A

usn

ahm

en

11

Nach einem try-Block muß immer mindestens ein catch-Block existieren.

Beim Eintreten einer Ausnahme wird der erste passende catch-Block abgearbeitet.

Der finally-Block muß immer nach allen catch-Blöcken stehen. 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

Page 12: DVG1 - 11 - Ausnahmen1 Ausnahmen. DVG1 - 11 - Ausnahmen 2 Was sind Programmfehler? Programm erzielt gar kein Ergebnis. Berechnetes Ergebnis stimmt nicht

DV

G1

- 11 - A

usn

ahm

en

12

try-Block Ausnahme Ausnahmetyp1 Catch-Block 1

AusnahmetypN Catch-Block N

Ausnahmetyp2 Catch-Block 2

finally-Block

Page 13: DVG1 - 11 - Ausnahmen1 Ausnahmen. DVG1 - 11 - Ausnahmen 2 Was sind Programmfehler? Programm erzielt gar kein Ergebnis. Berechnetes Ergebnis stimmt nicht

DV

G1

- 11 - A

usn

ahm

en

13

import java.io.*;public class test5{public static void main (String [] args){System.out.println("Gebe bitte eine Zeichenkette ein : ");BufferedReader br = new BufferedReader(

new InputStreamReader(System.in));String s = br.readLine();System.out.println("Es wurde eingegeben :\n\""+s+"\"");}}

javac test5.java ergibt

test5.java:9: unreported exception java.io.IOException; must be caught or declared to be thrown

System.in.read(buffer);

Page 14: DVG1 - 11 - Ausnahmen1 Ausnahmen. DVG1 - 11 - Ausnahmen 2 Was sind Programmfehler? Programm erzielt gar kein Ergebnis. Berechnetes Ergebnis stimmt nicht

DV

G1

- 11 - A

usn

ahm

en

14

public class test6{public static void main (String [] args){

System.out.println("Gebe bitte eine Zeichenkette ein : ");BufferedReader br = new BufferedReader(

new InputStreamReader(System.in));try{

String s = br.readLine();System.out.println("Es wurde eingegeben :\n\""+s+"\"");

}catch (java.io.IOException e){}

}}java test6 ergibtGebe bitte eine Zeichenkette ein :Das ist ein Test.Es wurde eingegeben :"Das ist ein Test."

Page 15: DVG1 - 11 - Ausnahmen1 Ausnahmen. DVG1 - 11 - Ausnahmen 2 Was sind Programmfehler? Programm erzielt gar kein Ergebnis. Berechnetes Ergebnis stimmt nicht

DV

G1

- 11 - A

usn

ahm

en

15

geprüfte bzw. ungeprüfte Ausnahmen

Ausnahmen NumberFormatException und ArrayIndexOutOfBoundsException brauchten nicht abgefangen zu werden, d.h. es musste keine catch-Anweisung für diese Ausnahmen angegeben werden. ==> ungeprüfte Ausnahmen

Ausnahme java.io.IOException musste abgefangen werden. ==> geprüfte Ausnahmen

Page 16: DVG1 - 11 - Ausnahmen1 Ausnahmen. DVG1 - 11 - Ausnahmen 2 Was sind Programmfehler? Programm erzielt gar kein Ergebnis. Berechnetes Ergebnis stimmt nicht

DV

G1

- 11 - A

usn

ahm

en

16

Throwable

Error

ungeprüft

IOException

geprüft

RuntimeException

ungeprüft

Exception

geprüft ungeprüft

Eigene Ausnahmen

nicht empfohlenEigene Ausnahmen

meist benutzt

Eigene Ausnahmen

möglich

Eigene Ausnahmen

nicht empfohlen

Ausnahmenhierarchie

Page 17: DVG1 - 11 - Ausnahmen1 Ausnahmen. DVG1 - 11 - Ausnahmen 2 Was sind Programmfehler? Programm erzielt gar kein Ergebnis. Berechnetes Ergebnis stimmt nicht

DV

G1

- 11 - A

usn

ahm

en

17

Weiterreichen von Ausnahmen

Eine Ausnahme muss nicht in der Methode behandelt werden, in der sie auftritt. Sie kann auch an die aufrufende Methode weitergereicht werden.

Das wird dem Compiler durch die throws-Klausel einer Methoden-Deklaration mitgeteilt, z.B.:

public static String readString() throws java.io.IOException

Page 18: DVG1 - 11 - Ausnahmen1 Ausnahmen. DVG1 - 11 - Ausnahmen 2 Was sind Programmfehler? Programm erzielt gar kein Ergebnis. Berechnetes Ergebnis stimmt nicht

DV

G1

- 11 - A

usn

ahm

en

18

import java.io.*;public class test7{public static void main (String [] args){ System.out.println("Gebe bitte eine Zeichenkette ein : "); System.out.println(

"Es wurde eingegeben :\n\""+readString()+"\"");}public static String readString(){

try{

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

return br.readLine();}catch (IOException e){

return null;}

}}

Page 19: DVG1 - 11 - Ausnahmen1 Ausnahmen. DVG1 - 11 - Ausnahmen 2 Was sind Programmfehler? Programm erzielt gar kein Ergebnis. Berechnetes Ergebnis stimmt nicht

DV

G1

- 11 - A

usn

ahm

en

19

import java.io.*;

public class test8{public static void main (String [] args) throws IOException{ System.out.println("Gebe bitte eine Zeichenkette ein : "); System.out.println(

"Es wurde eingegeben :\n\""+readString()+"\"");}public static String readString() throws IOException{

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

return br.readLine();}}

Page 20: DVG1 - 11 - Ausnahmen1 Ausnahmen. DVG1 - 11 - Ausnahmen 2 Was sind Programmfehler? Programm erzielt gar kein Ergebnis. Berechnetes Ergebnis stimmt nicht

DV

G1

- 11 - A

usn

ahm

en

20

Auslösen von Ausnahmen

Ausnahmen können durch das Programm ausgelöst werden, durch

throw new Ausnahme (...);

Page 21: DVG1 - 11 - Ausnahmen1 Ausnahmen. DVG1 - 11 - Ausnahmen 2 Was sind Programmfehler? Programm erzielt gar kein Ergebnis. Berechnetes Ergebnis stimmt nicht

DV

G1

- 11 - A

usn

ahm

en

21

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)

Page 22: DVG1 - 11 - Ausnahmen1 Ausnahmen. DVG1 - 11 - Ausnahmen 2 Was sind Programmfehler? Programm erzielt gar kein Ergebnis. Berechnetes Ergebnis stimmt nicht

DV

G1

- 11 - A

usn

ahm

en

22

Eigene Ausnahmen

Ausnahmen sind Klassen, die von anderen Ausnahmeklassen abgeleitet sind.

Einfachste Form:

class Ausnahme extends OberKlasse { }

z.B.:

class Ausnahme extends Exception { }

Page 23: DVG1 - 11 - Ausnahmen1 Ausnahmen. DVG1 - 11 - Ausnahmen 2 Was sind Programmfehler? Programm erzielt gar kein Ergebnis. Berechnetes Ergebnis stimmt nicht

DV

G1

- 11 - A

usn

ahm

en

23

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 ergibtAusnahme

Page 24: DVG1 - 11 - Ausnahmen1 Ausnahmen. DVG1 - 11 - Ausnahmen 2 Was sind Programmfehler? Programm erzielt gar kein Ergebnis. Berechnetes Ergebnis stimmt nicht

DV

G1

- 11 - A

usn

ahm

en

24

Lesemethoden

Was wollen wir einlesen? Zeichenketten, Texte numerische Daten

ganze Zahlen (byte, short, int, long) Gleitkommazahlen (float, double)

Felder Auswahlen, Menüs

Page 25: DVG1 - 11 - Ausnahmen1 Ausnahmen. DVG1 - 11 - Ausnahmen 2 Was sind Programmfehler? Programm erzielt gar kein Ergebnis. Berechnetes Ergebnis stimmt nicht

DV

G1

- 11 - A

usn

ahm

en

25

Einlesen von Zeichenketten

System.in realisiert Eingabestrom von bytes, wir benötigen gepufferte Eingabe von Unicodezeichenketten.

InputStreamReader rd = new InputStreamReader(System.in) erzeugt Eingabestrom von Unicodezeichen.

BufferedReader br = new BufferedReader(rd) erzeugt gepufferten Eingabestrom von Unicodezeichen.

Zusammen:BuffredReader br = new BufferedReader(new InputStreamReader(System.in))

Page 26: DVG1 - 11 - Ausnahmen1 Ausnahmen. DVG1 - 11 - Ausnahmen 2 Was sind Programmfehler? Programm erzielt gar kein Ergebnis. Berechnetes Ergebnis stimmt nicht

DV

G1

- 11 - A

usn

ahm

en

26

public static double readDouble ( ){

for (;;){ try { String s = readString();

return Double.parseDouble(s); } catch ( NumberFormatException e ) { System.out.print("Nochmal:"); }}}

Page 27: DVG1 - 11 - Ausnahmen1 Ausnahmen. DVG1 - 11 - Ausnahmen 2 Was sind Programmfehler? Programm erzielt gar kein Ergebnis. Berechnetes Ergebnis stimmt nicht

DV

G1

- 11 - A

usn

ahm

en

27

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:"); }}}

Page 28: DVG1 - 11 - Ausnahmen1 Ausnahmen. DVG1 - 11 - Ausnahmen 2 Was sind Programmfehler? Programm erzielt gar kein Ergebnis. Berechnetes Ergebnis stimmt nicht

DV

G1

- 11 - A

usn

ahm

en

28

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:"); }}}

Page 29: DVG1 - 11 - Ausnahmen1 Ausnahmen. DVG1 - 11 - Ausnahmen 2 Was sind Programmfehler? Programm erzielt gar kein Ergebnis. Berechnetes Ergebnis stimmt nicht

DV

G1

- 11 - A

usn

ahm

en

29

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); }}}

Page 30: DVG1 - 11 - Ausnahmen1 Ausnahmen. DVG1 - 11 - Ausnahmen 2 Was sind Programmfehler? Programm erzielt gar kein Ergebnis. Berechnetes Ergebnis stimmt nicht

DV

G1

- 11 - A

usn

ahm

en

30

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); }}}

Page 31: DVG1 - 11 - Ausnahmen1 Ausnahmen. DVG1 - 11 - Ausnahmen 2 Was sind Programmfehler? Programm erzielt gar kein Ergebnis. Berechnetes Ergebnis stimmt nicht

DV

G1

- 11 - A

usn

ahm

en

31

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.: -1.234567E-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); }}}