Exception - megloff.ch

Werbung
Java
Programmierung mit
Exceptions
> Fehlerbehandlung
in Java
Mark Egloff 2006
1
Java
Programmierung mit
Lernziel Heute Abend
>
Sie lernen die Bedeutung von Exceptions kennen
>
Sie wissen wie Laufzeitfehler in Java erzeugt und gehandhabt
werden
>
Sie können gezielt eigene Fehlerbehandlungen
implementieren
Mark Egloff 2006
2
Java
Programmierung mit
Exceptions
„Wir sind in Sicherheit! Er kann uns nicht erreichen! – Sicher? –
Ganz sicher! Bären haben Angst vor Treibsand!“
Häger, Dik Browne
Mark Egloff 2006
3
Java
Programmierung mit
Exceptions
Was ist eine „Exception“ ?
>
Exceptions bedeutet übersetzt Laufzeitfehler oder Ausnahmesituation.
Darunter werden Fehler verstanden, welche erst bei der Ausführung des
Programms auftreten
>
Viele Laufzeitfehler lassen sich auf Programmierfehler zurückführen z.B.
NullPointerException, die aber unter Umständen nur bei seltenen
Situationen stattfinden. Die Gründe können manchmal sehr komplex sein
>
Es gibt auch Laufzeitfehler die nicht unbedingt auf „schlechte“ Programmierung zurückzuführen sind z.B. Datei auf CD-ROM abspeichern
 Der Benützer wählte das falsche Laufwerk.
>
All diese Laufzeitfehler müssen von unseren Programmen erkannt und
behandelt werden, ansonsten würde das Programm einfach „abstürzen“
>
Java bietet eine elegante Methode, um mit Fehlern flexibel umzugehen
Mark Egloff 2006
4
Java
Programmierung mit
Excpetions
Unterschiede Compiler- Fehler vs. Laufzeitfehler
>
Fehler können anhand des Zeitpunkts ihres Auftretens unterschieden
werden: Fehler treten schon bei der Übersetzung oder erst zur Laufzeit auf.
>
Sicherlich sind Fehler, die der Compiler entdeckt, die angenehmeren. Man
kann sie analysieren und den Code entsprechend anpassen.
>
Im ungünstigeren Fall treten Laufzeitfehler erst beim Anwender – dem
Kunden – auf und beenden das Programm ohne geeignete Behandlung,
lassen es »abstürzen«.
>
Die Behandlung der Laufzeitfehler macht bei interaktiven Programmen
häufig den Hauptteil des Codes aus. Die produktiven Programmteile sind
mit unzähligen Kontrollanweisungen durchsetzt, die auf Umweltsituationen
reagieren müssen  Konfigurationsmanagement
>
Laufzeitfehler werden daher häufig ignoriert!  da Aufwendig
Mark Egloff 2006

5
Java
Programmierung mit
Excpetions
Typische Laufzeitfehler
>
Hier sind einige Laufzeitfehler aufgelistet, die wohl am häufigsten
Programme zum Absturz bringen:
>
NullPointerException: Zugriff über eine Referenz auf eine Objekteigenschaft.
Die Referenz zeigt aber auf kein Objekt sondern ist NULL
>
ArrayIndexOutOfBoundsException: Zugriff auf Arrayfelder ausserhalb der
Arraygrenzen
>
IllegalArgumentException: Ungültiger Parameterwert wurde übergeben
>
ArithmeticException: Division durch 0
Mark Egloff 2006
6
Java
Programmierung mit
Excpetions
Beispiel eines „unerwarteten“ Laufzeitfehler (1/3)
>
In den abgegeben Dateien Finden Sie eine Applikation, die „manchmal“
einen Fehler auslöst. Die Applikation ist schon bekannt der DES
Verschlüsseler von Lektion 06
>
Öffnen Sie nun das vorbereitete Projekt in Eclipse:
1. Lektion11.zip Datei vom Email entpacken und in einen Ordner ablegen
2. Eclipse starten
3. Projekt importieren mittels Menu „File > Import“
4. Aus dem Import Wizard „General > Existing Project into Workspace“ wählen
5. Den Ordner „Lektion 11\Example“ aus der entpackten Zip Datei wählen
>
Starten Sie „RunVerschluesselung“. Die Applikation liest ein String ein und
verschlüsselt es mit dem „DES“ Algorithmus. Experimentieren Sie mit
unterschiedlichen Text längen 5-10 Zeichen. Was Stellen Sie fest?
Mark Egloff 2006
7
Java
Programmierung mit
Excpetions
Beispiel eines „unerwarteten“ Laufzeitfehler (2/3)
>
Die Applikation löst bei einer bestimmten String Längen (x % 8 == 0) einen
Fehler aus und bricht das Programm aus. Das wäre ärgerlich wäre es beim
Testen nicht aufgefallen
Ablauf des Programmes „RunVerschluesselung“
Bitte geben sie den Text für eine Verschlüsselung ein:
Java ist einfach
DES verschlüsselung:16
’d}¾Öíb=«^fŸåbHˆ?¥J•
Exception in thread "main" java.lang.RuntimeException:
javax.crypto.BadPaddingException:
Given final block not properly padded
at DESVerschluessler.decrypt(DESVerschluessler.java:61)
at RunVerschluesselung.main(RunVerschluesselung.java:20)
Mark Egloff 2006
8
Java
Programmierung mit
Excpetions
Beispiel eines „unerwarteten“ Laufzeitfehler (3/3)
>
Noch ärgerlicher, wir „haben“ den SourceCode nicht zur Verfügung dort wo
der Fehler auftritt (DESVerschluessler.java:61). Somit bleibt uns nur noch
die Möglichkeit übrig den Fehler abzufangen und zu behandeln.
>
Hierzu verwenden wir die „try/catch“ Möglichkeit. Hängen Sie unten an den
bestehenden „catch“ Block in „main()“ folgenden Code an und
wiederholen Sie die Fehlerauslösung, beobachten Sie nun das Resultat.
catch(RuntimeException rt){
System.out.println("unerwarterter Fehler:" + rt);
}
>
Der Fehler tritt nun immer noch auf, aber wir haben nun die Möglichkeit an
dieser Stelle zu reagieren z.B. eine Behandlung oder gar Wiederholung
durchzuführen.
Mark Egloff 2006
9
Java
Programmierung mit
Exceptions
Früheres Konzept der Fehlerbehandlungen
>
Viele ältere Sprachen z.B. VB, C, Perl besitzen kein spezielles Konzept
für die Fehlerbehandlung
>
Es wurde oft der Rückgabewert einer Methode verwendet, um einen
Fehlschlag anzuzeigen. Der Fehlercode war häufig einfach –1, aber auch
NULL oder 0. Ein Standard gab es nicht
>
Ein Folge-Problem stellte dann Wartbarkeit des Programms dar. Der
Programmfluss wird durch Abfragen der Funktionsergebnisse
unangenehm unterbrochen. Häufig entstehen mit den Fehlerabfragen
kaskadierte if-Abfragen, die den Quellcode schwer lesbar machen. Die
Fehlerbehandlung erfolgte dann nicht zentral sondern war an mehreren
Stellen im Code verteilt.
>
Ein neues Konzept musste deshalb dringend her
Mark Egloff 2006
10
Java
Programmierung mit
Exceptions
Früheres Konzept der Fehlerbehandlungen
z.B.: Problem negativer Radius bei Klasse „Kreis“
Kreis k = new Kreis(-3.5f);
System.out.println( k.berechneUmfang() );  negativ
z.B. Methode mit Rückgabewert um Fehler zu signalisieren
public float berechneUmfang() {
if (this.radius < 0) return -1;
else return this.radius * 2 * PI;
}
z.B. Fehlerbehandlung anhand des Rückgabewertes
if (k.berechneUmfang() == -1 )
System.err.println("Fehler aufgetreten!");
Mark Egloff 2006
11
Java
Programmierung mit
Exceptions
Das neue Konzept: „Try“ und „Catch“
>
Das neue Konzept heisst „Try“ und „Catch“ und es wurde in die neueren
Sprachen (z.B. C++, Java, C#, Javascript, PHP) gerade als
grundlegender Syntax eingebettet
>
Bei der Verwendung dieses Konzeptes wird der Programmfluss nicht
unterbrochen, sondern ein besonders ausgezeichnetes Programmstück
wird bezüglich auftretender Fehler überwacht und gegebenenfalls
spezieller Code zur Behandlung solcher Fehler aufgerufen.
Mark Egloff 2006
12
Java
Programmierung mit
Exceptions
Das neue Konzept: „Try“ und „Catch“
>
Ein überwachter Programmbereich (Block) wird mit dem Schlüsselwort
„try“ eingeleitet und mit „catch“ beendet. Hinter „catch“ folgt der
Programmblock, der beim Auftreten eines Fehlers ausgeführt wird, um
den Fehler abzufangen oder zu behandeln.
>
Anstelle eines Fehlercodes wird im Falle eines Fehlers ein
Exceptionobjekt erzeugt, dass alle Angaben des Fehlers beinhaltet.
Dieses wird an die Behandlungsroutine weitergeleitet.
>
Um Fehlerbehandlungen zu erzwingen, überwacht der Compiler, dass
alle möglichen, auftretenden Fehler mittels „try“ und „catch“ in einer
Applikation behandelt werden. Wird dies nicht gemacht, treten
entsprechende Compilerfehler auf. Somit müssen Programmierer eine
Behandlung implementieren
Mark Egloff 2006
13
Java
Programmierung mit
Exceptions
Das neue Konzept: „Try“ und „Catch“
Beispiel 1: Einfache Methode mit „try“ und „catch“ Block
public void setRadius(float radius) {
try {
if ( radius < 0) throw new Exception("radius < 0!");
else this.radius = radius;
}
catch( Exception ex){
Fehlerauslösung
System.err.println(ex);
}
}
Fehlerbehandlung
Mark Egloff 2006
14
Java
Programmierung mit
Excpetions
Mark Egloff 2006
15
Java
Programmierung mit
Exceptions
Das neue Konzept: „Try“ und „Catch“
Der Programmfluss bei einer einfachen Exception
try
{
Try Block
Foo f = x.doRiskyThing()
Fehler
}
catch(Exception ex)
{
y.handleError(ex);
Catch Block
}
Ablauf im
Normalfall
Ablauf im
Fehlerfall
Mark Egloff 2006
16
Java
Programmierung mit
Exceptions
Syntax Regeln für „Try“
try { ... }
>
Mit „try“ leiten wir einen Block ein indem mögliche Exceptions
auftreten können
>
Nach dem Schlüsselwort „try“ folgt immer ein Block mit „{}“ Klammern
>
Nach dem „try“- Block muss mindestens ein „catch“- oder ein
„finally“- Block folgen.
Mark Egloff 2006
17
Java
Programmierung mit
Exceptions
Syntax Regeln für „Catch“
catch(Exception ex) { ... }
>
Mit „catch“ leiten wir einen Block ein indem geworfene Exceptions
aufgefangen und behandelt werden können
>
Nach dem Schlüsselwort „catch“ folgt eine Parameterübergabe. Dort
wird ein „Exception“ - Objekt an den Behandlungsblock übergeben. Es
muss der Typ und Namen des Parameters angegeben werden. Es wird
nur ein Parameter unterstützt und er muss vom Typ „Throwable“ sein
>
Nach der Parameterübergabe folgt der Implementationsblock mit „{}“
Klammern
>
Es dürfen mehrere „catch“-Blöcke nach einem „try“-Block folgen,
jedoch muss jeder „catch“ Block einen anderen Parametertyp
aufweisen, ähnliche Regel wie beim Überladen der Methoden.
Mark Egloff 2006
18
Java
Programmierung mit
Exceptions
Wie weiss ich wann welche Fehler auftreten können?
Beispiel 2: Ermittlung und implementation einer Fehlerbenhandlung
>
Wir wollen eine Datei mit Hilfe der Klasse
„java.io.RandomAccessFile“ zeilenweise auslesen. Hierzu
betrachten wir kurz das JavaDoc der Klasse
>
Aus der API-Dokumentation geht hervor, dass der Konstruktor von
„RandomAccessFile“ eine „FileNotFound“ Exception-Ausnahme
auslösen kann.
>
Mithilfe der Funktion „readLine()“ lesen wir so lange Zeilen ein, bis
die Datei ausgeschöpft ist. Die Methode „readLine()“ kann eine
„IOException“ auslösen.
>
Wir müssen diese Exceptions behandeln und setzen daher die
Problemzonen in einen try- und catch-Block.
Mark Egloff 2006
19
Java
Programmierung mit
Exceptions
Wie weiss ich wann welche Fehler auftreten können?
Beispiel 2: Ermittlung und implementation einer Fehlerbenhandlung
Auschnitt aus dem JavaDoc der Klasse „java.io.RandomAccessFile“
Mark Egloff 2006
20
Java
Programmierung mit
Exceptions
Wie weiss ich wann welche Fehler auftreten können?
Beispiel 2: Ermittlung und implementation einer Fehlerbenhandlung
import java.io.*;
public class ReadFileWithRAF {
public static void main( String[] args ) {
try {
RandomAccessFile f;
f = new RandomAccessFile( "EastOfJava.txt", "r" );
for ( String line; (line=f.readLine()) != null; )
System.out.println( line );
}
catch ( FileNotFoundException e ) {
System.err.println( "Datei gibt’s nicht!" );
}
catch ( IOException e ){
System.err.println( "Schreib- Leseprobleme!" );
}
}
}
Mark Egloff 2006
21
Java
Programmierung mit
Exceptions
Das neue Konzept: „Try“ und „Catch“
Wiederholung kritischer Bereiche
>
Es gibt in Java bisher keine Möglichkeit bei Exceptions, an den Punkt
zurückzukehren, der den Fehler ausgelöst hat. Das ist aber oft
erwünscht, z.B. wenn eine fehlerhafte Eingabe zu wiederholen ist.
>
Um dieses Problem zu lösen muss die Behandlung des Fehlers
innerhalb der Wiederholung bzw. Schleife erfolgen.
>
Hierbei ist natürlich Vorsicht geboten, da dies schnell zu
Endlosschleifen führen kann. Sofern möglich, sollten solche Konstrukte
vermieden werden
Mark Egloff 2006
22
Java
Programmierung mit
Exceptions
Das neue Konzept: „Try“ und „Catch“
Wiederholung kritischer Bereiche
z.B. Wiederholung einer Eingabe
int number = 0;
while ( true ) {
try {
System.out.print( "Bitte Zahl eingeben" );
number = Integer.parseInt( s );
break;
}
catch ( NumberFormatException e ) {
System.out.println( "Das war keine Zahl!" );
}
}
Mark Egloff 2006
23
Java
Programmierung mit
Exceptions
Fehler weiterleiten, die Anweisung „throws“
Es ist nicht immer sinnvoll jeden Fehler gerade an der Stelle zu
behandeln wo er aufgetreten ist. Dies würde in eine Unmenge von
„try“ und „catch“ Blöcken enden, welches die Wartbarkeit des Codes
erschweren würde.
>
Es gibt daher die Möglichkeit anstelle den Fehler direkt mit „catch“
abzufangen diesen einfach an die nächst höhere Methode im Stack
weiterzureichen. Dies erlaubt es später die Fehlerbehandlungen zu
zentralisieren und somit zu vereinfachen.
StackTrace
>
MyApp.main(args)
MyApp.eingabe()
Kreis.setRadius(r)
Mark Egloff 2006
Fehler
24
Java
Programmierung mit
Exceptions
Fehler weiterleiten, die Anweisung „throws“
>
Diese Weiterleitung wird mit einen Anweisung „throws“ erreicht. Diese
muss bei der Methodendeklaration nach der Parameterübergabe
angegeben werden. Falls mehrere Arten von Exceptions ausgelöst
werden, müssen diese einfach mittels Kommas getrennt aufgelistet
werden
z.B. Weiterleitung einer Exception
class Kreis {
...
public void setRadius(float radius) throws Exception {
if ( radius < 0) throw new Exception("radius < 0!");
else this.radius = radius;
}
}
Mark Egloff 2006
25
Java
Programmierung mit
Exceptions
Fehler weiterleiten, die Anweisung „throws“
>
Mittels der Weiterleitung „bubbelt“ der Fehler entlang nach oben und
kann dann irgendwann abgefangen werden
z.B. Weiterleitung und Abfangen der Exception in „main()“
class MyApp {
public static void main(String args[]) {
try {
Kreis k = eingabe(); Fehler
}
catch(Exception ex) {
System.err.println(ex);
}
}
}
Mark Egloff 2006
26
Java
Programmierung mit
Exceptions
Fehler weiterleiten, die Anweisung „throws“
>
Ist die Fehlerbehandlung in einer Applikation ganz „egal“, können wir
alle Fehler an die JVM weiterleiten, die dann das Programm im
Fehlerfall abbricht.
>
Hierbei muss lediglich die „throws“ Anweisung bei der
Methodendeklaration von „main()“ angewendet werden
z.B. Weiterleitung der Exception an die JVM
class MyApp {
public static void main(String args[]) throws Exception
{
...
}
}
Mark Egloff 2006
27
Java
Programmierung mit
Exceptions
Abschliessende Arbeiten mit „finally“
>
Es gibt Fälle wobei immer abschliessende Arbeiten getätigt werden
müssen. Diese sind unabhängig von den zuvor aufgetretenen Fehlern
z.B. die Freigabe von Ressourcen  schliessen von Dateien. Diese
müssen immer ausgeführt werden
>
Hierzu wurde im Konzept ein zusätzlicher Block vorgesehen Nach
einem (oder mehreren) catch kann deshalb optional ein „finally“Block folgen.
>
Die Anweisungen im „finally“-Block werden immer ausgeführt, auch
wenn in „try“ und „catch“ ein „return“, „break“ oder „continue“
steht.
 Das bedeutet, der „finally“ Block wird in jedem Fall
ausgeführt.
Mark Egloff 2006
28
Java
Programmierung mit
Exceptions
Abschliessende Arbeiten mit „finally“
Der Programmfluss bei „finally“
Try Block
try
{
Foo f = x.doRiskyThing()
}
Catch Block
catch(Exception ex)
{...}
Finally Block
finally
{
closeResources();
}
Mark Egloff 2006
Fehler
Ablauf im
Normalfall
Ablauf im
Fehlerfall
29
Java
Programmierung mit
Exceptions
Abschliessende Arbeiten mit „finally“
Beispiel: Freigabe der Ressource im „finally“ Block
import java.io.*;
public class ReadFileWithRAF {
public static void main( String[] args ) {
try {
RandomAccessFile f;
f = new RandomAccessFile( "EastOfJava.txt", "r" );
for ( String line; (line=f.readLine()) != null; )
System.out.println( line );
}
catch ( FileNotFoundException e ) {...}
catch ( IOException e ){...}
Dummerweise kann „close()“ ebenfalls
finally {
eine Exception auslösen
if ( f != null )
try { f.close(); }
catch ( IOException e ) { e.printStackTrace(); }
}
}
}
Mark Egloff 2006
30
Java
Programmierung mit
Exceptions
Syntax Regeln für „finally“
finally { ... }
>
Mit „finally“ leiten wir einen Block ein, der in jedem Fall abgearbeitet
wird. Er ist daher ideal um abschliessende Arbeiten zu tätigen
>
Der „finally“ Block ist im Zusammenhang mit „try“ und „catch“
optional. Jedoch kann „finally“ nicht alleine für sich stehen. Er muss
immer nach einem „try“ Block folgen.
>
Nach dem Schlüsselwort „finally“ folgt der Implementationsblock mit
„{}“ Klammern
>
Es darf pro „try“ Block nur ein „finally“ Block implementiert werden
Mark Egloff 2006
31
Java
Programmierung mit
Exceptions
Abschliessende Arbeiten mit „finally“
Beispiel: „try“ und „finally“ ohne „catch“ Block
public class NoCatchBecauseOfFinallyBlock
{
static void buh() {
try {
throw new ArithmeticException(
"Keine Lust zu rechnen" );
}
finally {
System.out.println( "Mach noch was zum Schluss!" )
}
}
public static void main( String[] args ) {
buh();
}
}
Mark Egloff 2006
32
Java
Programmierung mit
Exceptions
Abschliessende Arbeiten mit „finally“
Beispiel: Keine Exceptionweiterleitung
public class NoExceptionBecauseOfFinallyReturn
{
static void buh() {
try {
throw new ArithmeticException(
"Keine Lust zu rechnen" );
}
finally {
Dummerweise wird die Methode vorher verlassen
return;
bevor die Weiterleitung der Exception erfolgen
}
kann!
}
public static void main( String[] args ) {
buh();
}
}
Mark Egloff 2006
33
Java
Programmierung mit
Exceptions
Exceptions sind Objekte
Erzeugung und Handhabung von Exceptions
>
Tritt ein Fehler auf, so wird ein so genanntes Exception-Objekt erzeugt.
Diese wird dann an den nächsten, entsprechenden „catch“ Block als
Parameter übergeben.
>
Dieses Objekt ist ein ganz normales Java Objekt und stammt von einer
Klasse „java.lang.Throwable“ ab (Basisklasse aller Exceptions).
Es werden somit alle nötigen Angaben des Fehlers in ein Objekt
gepackt und stehen dann bei der Behandlung zur Verfügung
>
Eine Exception wird zuerst mittels dem „new“ Operator und dem
Konstruktoraufruf der Klasse instanziert. Danach wird es mit der
Anweisung „throw“ geworfen bzw. als Fehler ausgelöst
Mark Egloff 2006
34
Java
Programmierung mit
Exceptions
Exceptions sind Objekte
Erzeugung und Handhabung von Exceptions
z.B. Erstellung und Auslösung einer Exception
public void setRadius(float radius) {
if ( radius < 0)
throw new IllegalArgumentException("radius < 0!");
}
1. Exception-Klasse muss vom Typ „Throwable“ abgeleitet sein
2. Exception-Objekt instanzieren
3. Exception-Objekt mittels „throw“ werfen
Mark Egloff 2006
35
Java
Programmierung mit
Exceptions
Exceptions sind Objekte
Erzeugung und Handhabung von Exceptions
>
Wichtige Eigenschaften eines Exception-Objektes sind:
>
„getClass()“: die Klasse selber gibt den Typ der Exception an
>
„getMessage()“:Fehlermeldung (falls nötig in mehreren Sprachen)
>
„printStackTrace()“: Ausgabe des Stacktrace (Angabe in welcher Klasse,
Methode und bei welcher Linie des SourceCodes der Fehler ausgelöst wurde)
>
„getCause()“: Ursprünglicher Fehler (falls dies nur ein Folgefehler bzw. eine
Weiterleitung war)
z.B. Zugriff auf Eigenschaften des Exception-Objektes bei der Behandlung
catch(IllegalArgumentException ex){
System.err.println( ex.getMessage() );
ex.printStackTrace();
}
Mark Egloff 2006
36
Java
Programmierung mit
Exceptions
Arten und Hierarchie von Exceptions
>
Das Java API besitzt eine grosse Menge an unterschiedlichen ExceptionKlassen ca.750 Klassen.
>
Bei einer solchen grossen Menge an verschiedenartiger Fehler wäre der
Programmierer überfordert für jede einzelne mögliche Exception eine
entsprechende Behandlungsroutine zu implementieren
>
Um diese Handhabung zu vereinfachen wurde die Hierarchie bei der
Behandlung der Exceptions berücksichtigt. Diese erlaubt es, Fehler
generisch handzuhaben.
>
Als Grundlage für dieses Hierarchie-Konzept wird die Vererbung und das
Überladen von Methoden bzw. von „catch“ Blöcken verwendet
Mark Egloff 2006
37
Java
Programmierung mit
Exceptions
Arten und Hierarchie von Exceptions
>
Eine Exception ist ein Objekt, welches direkt oder indirekt von
„java.lang.Throwable“ abgeleitet ist.
>
Von dort aus verzweigt sich die Vererbungshierarchie der Exception-Arten
nach „java.lang.Exception“ und „java.lang.Error“.
>
Die Klassen, die aus „Error“ hervorgehen, müssen nicht weiterverfolgt
werden. Es handelt sich hierbei um Fehler, die so schwerwiegend sind,
dass sie zur Beendigung des Programms führen und vom Programmierer
nicht weiter beachtet werden müssen.
Mark Egloff 2006
38
Java
Programmierung mit
Exceptions
Arten und Hierarchie von Exceptions
Mark Egloff 2006
39
Java
Programmierung mit
Exceptions
Arten und Hierarchie von Exceptions
Mark Egloff 2006
40
Java
Programmierung mit
Exceptions
Arten und Hierarchie von Exceptions
>
Alle Exceptions können vom Typ der Basisklasse und somit auch als
„Throwable“ gehandhabt werden.
z.B. Austauschbarkeit bei Objekten, dies gilt auch bei Exceptions
Throwable t = new FileNotFoundException();
Exception e = new FileNotFoundException();
IOException ioe =
new FileNotFoundException();
FilenotFoundException fnfe =
new FileNotFoundException();
Throwable
Exception
IOException
FileNotFoundException
Mark Egloff 2006
41
Java
Programmierung mit
Exceptions
Arten und Hierarchie von Exceptions
>
Dieses Prinzip erlaubt uns zu entscheiden nach welcher Priorität wir die
Exceptions handhaben möchten. z.B. können wir gewisse Exceptions
generisch oder andere explizit abhandeln
>
Wenn zum Beispiel eine „FileNotFoundException“ auftritt, dann ist
diese Klasse von „IOException“ abgeleitet. Wenn wir alle
„IOException“ auffangen, behandeln wir damit auch gleichzeitig die
„FileNotFoundException“ mit
>
Besitzt ein „try“ Block mehrere „catch“ Blöcke so wird jeweils der
„catch“ Block genommen bei dem der Parameterdatentyp mit dem
jeweiligen Exception-Objekt am nächsten verwand ist
Mark Egloff 2006
42
Java
Programmierung mit
Exceptions
Arten und Hierarchie von Exceptions
Beispiel: „FileNotFoundException“ als „IOException“ handhaben
RandomAccessFile f = null;
try {
f = new RandomAccessFile( "d:/file.txt, "r" );
Fehler
for ( String line; (line = f.readLine()) != null; )
System.out.println( line );
}
catch ( IOException e ) {
System.err.println( "Ein/Ausgabe-Probleme." );
Throwable
}
Exception
IOException
FileNotFoundException
Mark Egloff 2006
43
Java
Programmierung mit
Exceptions
Arten und Hierarchie von Exceptions
Beispiel: „IOException“ als „Exception“ handhaben
RandomAccessFile f = null;
try {
f = new RandomAccessFile( "d:/file.txt, "r" );
for ( String line; (line = f.readLine()) != null; )
System.out.println( line );
}
Fehler
catch ( FileNotFoundException e ) {...}
catch ( Exception e ) {...}
Throwable
catch ( Throwable t ) {...}
Exception
IOException
FileNotFoundException
Mark Egloff 2006
44
Java
Programmierung mit
Exceptions
Arten und Hirarchie von Exceptions
>
Um alle Arten von Fehlern abzufangen können die Exceptions jeweils
weitergeleitet werden und in „main()“ als Typ „Throwable“ behandelt
werden
z.B. Generische Handhabung von Exceptions
class MyApp {
public static void main(String args[]) {
try {
...
}
catch( Throwable t ) {
System.err.println(t);
}
}
}
Mark Egloff 2006
45
Java
Programmierung mit
Exceptions
Arten und Hierarchie von Exceptions
RuntimeExceptions
>
Einige Fehlerarten können potenziell an vielen Programmstellen auftreten,
etwa eine Division durch 0 oder ungültige Indexwerte beim Zugriff auf
Array-Elemente.
>
Treten solche Fehler beim Programmlauf auf, liegt in der Regel ein
Denkfehler des Programmierers vor, und das Programm sollte
normalerweise nicht versuchen, die ausgelöste Ausnahme aufzufangen
und zu behandeln.
>
Daher wurde die Unterklasse „RuntimeException“ eingeführt, die Fehler
beschreibt, die vom Programmierer behandelt werden können, aber nicht
müssen.
Mark Egloff 2006
46
Java
Programmierung mit
Exceptions
Arten und Hierarchie von Exceptions
RuntimeExceptions
Mark Egloff 2006
47
Java
Programmierung mit
Exceptions
Arten und Hierarchie von Exceptions
Harte Fehler: Errors
>
Fehler, die von der Klasse „java.lang.Error“ abgeleitet sind, stellen
Fehler dar, die mit der JVM in Verbindung stehen.
>
Beispiele für konkrete Error-Klassen sind AnnotationFormatError,
AssertionError, AWTError, CoderMalfunctionError,
FactoryConfigurationError, LinkageError, ThreadDeath,
TransformerFactoryConfigurationError, VirtualMachineError (mit den
Unterklassen InternalError, OutOfMemoryError, StackOver-flowError,
UnknownError).
>
Da solche Fehler „abnormales“ Verhalten anzeigen, müssen sie auch nicht
mit einem „try/catch“-Block aufgefangen werden oder mit „throws“
weiter nach oben geleitet werden.
Mark Egloff 2006
48
Java
Programmierung mit
Exceptions
Arten und Hierarchie von Exceptions
Unchecked Exceptions
>
„RunTimeExceptions“ und „Error“ werden nicht vom Compiler überwacht.
Man spricht auch in solchen Fällen von „Unchecked Exceptions“
Mark Egloff 2006
49
Java
Programmierung mit
Exceptions
Eigene Exception Klassen definieren
>
Bevor man eigene Exceptionklassen entwirft, sollte man sich erst
überlegen was für eine Art von Fehler es ist und wie er behandelt werden
sollte. Hierbei sind folgende Denkschritte hilfreich:
1.
2.
Beschreibt wirklich keine bestehende Exception Klasse des Java API diese
Ausnahme?  JavaDoc ansehen, mit Google nach Hinweisen suchen
>
Ja
>
Nein  Eigene Exceptionklasse implementieren
 Bestehende Klassen verwenden oder von Ihr ableiten
Suchen der geeigneten Basis-ExceptionKlasse: Muss der Programmierer
diese zwingend behandeln?
>
Ja
>
Nein  „Error“ oder „RuntimeException“ als Basisklasse nehmen
 „Throwable“ oder „Exception“ als Basisklasse nehmen
Mark Egloff 2006
50
Java
Programmierung mit
Exceptions
Eigene Exception Klassen definieren
>
Eigene Exceptions sind direkte oder indirekte Unterklassen von Exception.
Sie implementieren oft zwei Konstruktoren: einen Standard-Konstruktor
und einen mit einem String parametrisierten Konstruktor.
z.B. Eigene Exception-Klasse implementieren
public class IllegalSchokoColorException
extends IllegalArgumentException {
public IllegalSchokoColorException() {
super();
}
public IllegalSchokoColorException( String s ) {
super( s );
}
}
Mark Egloff 2006
51
Java
Programmierung mit
Exceptions
Eigene Exception Klassen definieren
z.B. Eigene Exception-Klasse werfen
class Schokolade {
String f;
public Schokolade(String f) {
this.f = f;
}
public test() throws IllegalSchokoColorException {
if (...)
throw new IllegalSchokoColorException(
"Diese Schokoladen-Farbe gibt es nicht:" + f);
}
Mark Egloff 2006
52
Java
Programmierung mit
Exceptions
Eigene Exception Klassen definieren
z.B. Eigene Exception-Klasse werfen
class MyApp {
public static void main( String[] args ){
try {
Schokolade ws = new Schokolade( "pink" );
ws.test();
}
catch( IllegalSchokoColorException isce ) {
System.err.println( "Falsche Schokoladen-Farbe" );
isce.printStackTrace();
}
}
}
Mark Egloff 2006
53
Java
Programmierung mit
Exceptions
Eigene Exception Klassen definieren
z.B. Eigene Exception-Klasse werfen - Ausgabe
Falsche Schokoladen-Farbe:
IllegalSchokoColorException: Diese Schokoladen-Farbe gibt
es nicht: pink
at Schokolade.<init>(Schokolade.java:11)
Mark Egloff 2006
54
Java
Programmierung mit
Exceptions
Geschachtelte Exceptions
>
In Java lassen sich Exceptions ineinander verschachteln. Dies ist nützlich
um z.B. Folgefehler zu kreieren
>
Ein Anwendungsfall wäre hierzu eine Transaktion. Ist ein Teil der Kette
fehlerhaft, so ist der ganze Teil nicht ausführbar.
>
Eine geschachtelte Exception (engl. nested exception) speichert einen
Verweis auf eine weitere Ausnahme. Wenn ein Exception-Objekt
aufgebaut wird, lässt sich der Grund (engl. cause) als Argument im
Konstruktor der Throwable-Klasse übergeben. Die Ausnahme-Basisklasse
bietet dafür zwei Konstruktoren:
>
Throwable( Throwable cause )
>
Throwable( String message, Throwable cause )
Mark Egloff 2006
55
Java
Programmierung mit
Exceptions
Geschachtelte Exceptions
z.B. Eine geschachtelte Exception erzeugen und behandeln
public static void main( String[] args ){
try {
throw new Exception( new Exception("inner"));
}
catch( Exception ex ) {
Throwable cause ex.getCause();
cause.printStackTrace();
}
}
Bei generischen Fehlerbehandlungen muss deshalb speziell darauf
geachtet werden, dass auch die „cause“ Exception ausgewertet
wird
Mark Egloff 2006
56
Java
Programmierung mit
Exceptions
Tipps
>
Bestehender Programmfluss analysieren und verstehen, so dass
Exceptions gezielt eingesetzt werden können
>
Nie eine Exception ignorieren und „catch“ Blöcke nie leer lassen!
>
Zuerst das das Exception-Objekt erzeugen und dann werfen. Danach
Programm in sicheren Zustand bringen z.B. im „finally“ Block
Ressourcen freigeben
>
Kein „return“ in einem „finally“ Block, da dies die Exception
Behandlung unterbricht
>
Wenn möglich kein „return“ in einem „try“ Block, da dies oft Neulinge
verwirrt
>
Den „finally“ Block verwenden um Ressourcen freizugeben
Mark Egloff 2006
57
Java
Programmierung mit
Exceptions
Tipps
>
Werfe keine Exceptions aus Konstruktoren. Innerhalb von Konstruktoren
sollten keine kritischen Tasks erledigt werden.
>
Verwende kein Exceptionhandling für Programmfluss-Steuerungen
>
Wenn möglich „try/catch“ Blöcke ausserhalb von Schleifen verwenden
>
Weiterleitung von Exceptions beeinflussen die Methodendeklarationen und
die Deklaration der „catch“ Blöcke. Nachträgliches ändern von
Exceptionklassen kann daher eine Kettenreaktion auslösen.
>
Es sollte sehr sorgfältig zwischen „checked“ und „unchecked“ Exception
ausgewählt werden.
>
Anstelle von vielen eigenen Exceptions eine Exceptionklasse mit
Errorcode verwenden. Dies vereinfacht auch die Übersetzung der
Fehlermeldungen im Falle von Mehrsprachigkeit
Mark Egloff 2006
58
Java
Programmierung mit
Exceptions
Zusammenfassung Exceptions
Mark Egloff 2006
59
Herunterladen