ausnahmen
Download
Skip this Video
Download Presentation
Ausnahmen

Loading in 2 Seconds...

play fullscreen
1 / 35

Ausnahmen - PowerPoint PPT Presentation


  • 111 Views
  • Uploaded on

Ausnahmen. 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

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' Ausnahmen' - gabby


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
ausnahmen

Ausnahmen

DVG1 - Ausnahmen

was sind programmfehler
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

DVG1 - Ausnahmen

fehlerursachen
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

DVG1 - Ausnahmen

ausnahmen in java
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 aber einfache Möglichkeiten zur Behandlung von Ausnahmen.

DVG1 - Ausnahmen

slide5
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)

DVG1 - Ausnahmen

slide6
Fehlerursache: 11234xx läßt 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?“

DVG1 - Ausnahmen

slide7

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)

DVG1 - Ausnahmen

slide8

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!

DVG1 - Ausnahmen

slide9

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.

DVG1 - Ausnahmen

allgemeine form
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

}

DVG1 - Ausnahmen

slide11
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

DVG1 - Ausnahmen

slide12

Ausnahmetyp1

try-Block

Ausnahme

Catch-Block 1

Ausnahmetyp2

Catch-Block 2

AusnahmetypN

Catch-Block N

finally-Block

DVG1 - Ausnahmen

slide13

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

DVG1 - Ausnahmen

slide14

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."

DVG1 - Ausnahmen

gepr ft bzw ungepr fte ausnahmen
geprüft bzw. ungeprüfte Ausnahmen
  • Ausnahmen NumberFormatExceptionundArrayIndexOutOfBoundsExceptionbrauchten 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

DVG1 - Ausnahmen

slide16

Ausnahmenhierarchie

Error

Exception

ungeprüft

geprüft

ungeprüft

Eigene Ausnahmen

Eigene Ausnahmen

nicht empfohlen

meist benutzt

RuntimeException

IOException

ungeprüft

geprüft

Eigene Ausnahmen

Eigene Ausnahmen

nicht empfohlen

möglich

Throwable

DVG1 - Ausnahmen

weiterreichen von ausnahmen
Weiterreichen von Ausnahmen
  • Eine Ausnahme muß 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

DVG1 - Ausnahmen

slide18

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()+"\"");

}

}

DVG1 - Ausnahmen

slide19

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()+"\"");

}

}

DVG1 - Ausnahmen

ausl sen von ausnahmen
Auslösen von Ausnahmen
  • Ausnahmen können durch das Programm ausgelöst werden, durch

throw new Ausnahme (...);

DVG1 - Ausnahmen

slide21

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)

DVG1 - Ausnahmen

eigene ausnahmen
Eigene Ausnahmen
  • Ausnahmen sind Klassen, die von anderen Ausnahmeklassen abgeleitet sind.
  • Einfachste Form:

class Ausnahme extends OberKlasse { }

z.B.:

class Ausnahme extends Exception { }

DVG1 - Ausnahmen

slide23

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

DVG1 - Ausnahmen

lesemethoden
Lesemethoden
  • Was wollen wir einlesen?
    • Zeichenketten, Texte
    • numerische Daten
      • ganze Zahlen (byte, short, int, long)
      • Gleitkommazahlen (float, double)
    • Felder
    • Auswahlen, Menüs

DVG1 - Ausnahmen

einlesen von zeichenketten
Einlesen von Zeichenketten
  • 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
  • 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

DVG1 - Ausnahmen

slide26

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;

}

}

DVG1 - Ausnahmen

slide27

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;

}

}

DVG1 - Ausnahmen

slide28

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;

}

}

DVG1 - Ausnahmen

slide29

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; i<sbuf.length;i++) buffer[i] = sbuf[i];

ir=System.in.read(buffer,sbuf.length,ir2)+sbuf.length;

}

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;

}

}

DVG1 - Ausnahmen

slide30

public static double readDouble (

)

{

for (;;)

{

try

{

String s = readString();

return Double.parseDouble(s);

}

catch ( NumberFormatException e )

{

System.out.print("Nochmal:");

}

}}

DVG1 - Ausnahmen

slide31

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

}

}}

DVG1 - Ausnahmen

slide32

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

}

}}

DVG1 - Ausnahmen

slide33

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

}

}}

DVG1 - Ausnahmen

slide34

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

}

}}

DVG1 - Ausnahmen

slide35

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

}

}}

DVG1 - Ausnahmen