Download - Exception Handling in Java
![Page 1: Exception Handling in Java](https://reader036.vdokument.com/reader036/viewer/2022082613/56815032550346895dbe2e7a/html5/thumbnails/1.jpg)
Exception Handling in Java
Seminar aus Softwareentwicklung
Norbert Wiener
![Page 2: Exception Handling in Java](https://reader036.vdokument.com/reader036/viewer/2022082613/56815032550346895dbe2e7a/html5/thumbnails/2.jpg)
Ziele von Exception Handling
Programme robuster machen gegen: • fehlerhafte Eingaben
• Gerätefehler (Defekte, Platte voll, ...) • Programmierfehler (z.B. Division durch 0)
Trennung zwischen Algorithmus und Fehlerbehandlung
Fehlerbehandlung durch Compiler überprüfbar machen
![Page 3: Exception Handling in Java](https://reader036.vdokument.com/reader036/viewer/2022082613/56815032550346895dbe2e7a/html5/thumbnails/3.jpg)
Auslösen von Exception explizite Ausnahmen: „throw“ Anweisung im Code.
implizite Ausnahmen durch die JVM- Divison durch 0 => ArithmeticException- Zugriff über null-Ref. => NullPointerException- Ungültige Konvertierung => ClassCastException
setPassword(String pw) { ......
if(pw.length() < 5) throw new Exception(„mind. 5 Zeichen“); .......}
int intDiv (int i, int j) { return i/j; }
![Page 4: Exception Handling in Java](https://reader036.vdokument.com/reader036/viewer/2022082613/56815032550346895dbe2e7a/html5/thumbnails/4.jpg)
try-catch-finally Syntaxtry { Anweisungen;} catch (Ausnahme1 a1) { Fehlerbehandlung1;} catch (Ausnahme2 a2) { Fehlerbehandlung2;} finally { Aufräumen;}
Der finally-Block ist optional
Nach einem try-Block muss mindestens ein catch-Block folgen!
Bei mehreren catch-Blöcken beginnt die Suche der Ausnahmenbehandlung von
oben nach unten.
![Page 5: Exception Handling in Java](https://reader036.vdokument.com/reader036/viewer/2022082613/56815032550346895dbe2e7a/html5/thumbnails/5.jpg)
Beispiel
class Catch{ public static void main(String[] args){ try{ int i = Integer.parseInt(args[0]); System.out.print("i= "+i); }catch(ArrayIndexOutOfBoundsException e){ System.out.print("Parameter vergessen!"); }catch(NumberFormatException e){ System.out.print(" kein int-Wert!"); }finally{ System.out.println(" finally!"); } }}
Catch 123i= 123 finally!
Catch xykein int-Wert! finally!
CatchParameter vergessen! finally!
Finally wird immer ausgeführt!
![Page 6: Exception Handling in Java](https://reader036.vdokument.com/reader036/viewer/2022082613/56815032550346895dbe2e7a/html5/thumbnails/6.jpg)
Ausnahme-Klasse definieren
class MyException extends Exception{ public MyException() { super(); } public MyException(String msg) { super(msg); }}
Konstuktor ohne Parameter
Konstruktor mit Fehlermeldung
Eigener Exceptiontyp (indirekt) von
Throwable ableiten.
class MyException extends Exception{}
![Page 7: Exception Handling in Java](https://reader036.vdokument.com/reader036/viewer/2022082613/56815032550346895dbe2e7a/html5/thumbnails/7.jpg)
Die throws-Klausel
Weitergabe der Exception an die aufrufende Methode
setPassword(String pw) { try{ if(pw.length() < 5){ throw new Exception(„Fehler“); } }catch(Exception e){ Ausnahme behandeln! }}
static setPassword(String pw) throws Exception { if(pw.length() < 5){ throw new Exception(„Fehler“); }.......}
Try{ setPassword(pw);}catch(Exception e){ Ausnahme behandeln!}
![Page 8: Exception Handling in Java](https://reader036.vdokument.com/reader036/viewer/2022082613/56815032550346895dbe2e7a/html5/thumbnails/8.jpg)
throws Beispiel
..Main(...){
...... try{ A(x); }catch(Exc1 e)
{ ..print("Main");}........
........
A(int x)
throws Exc1{
try{
B(x);
}catch(Exc2 e){
...println("A");
}finally{
..println("finA")
}
}
........
B(int x)
throws Exc1, Exc2{
try{
C(x);
}catch(Exc3 e){
...println("B");
}finally{
...println("finB");
}
}
C(int x)
throws Exc1, Exc2 ,Exc3 {
try{
if(x==1){
throw new Exc1("F.");
}else if(x==2){
throw new Exc2();
}else if(x==3){
throw new Exc3();
}else{
throw new Exc4();
}
}catch(Exc4 e){
....println("C");
}
}
x=1
finB
finA
Main
x=2
finB
A
finA
x=3
B
finB
finA
x=4
C
finB
finA
![Page 9: Exception Handling in Java](https://reader036.vdokument.com/reader036/viewer/2022082613/56815032550346895dbe2e7a/html5/thumbnails/9.jpg)
Debugging von Ausnahmen
finBfinAMainFehler!Exc1: Fehler! at C.<init>(C.java:6) at B.<init>(B.java:4) at A.<init>(A.java:4) at Test.main(Test.java:6)
class Test{
static int x =1;
public static void main(String args[]) {
try{
A a= new A(x);
}catch(Exc1 e){
System.out.println("Main");
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}
e.getMessage()
e.printStackTrace()
![Page 10: Exception Handling in Java](https://reader036.vdokument.com/reader036/viewer/2022082613/56815032550346895dbe2e7a/html5/thumbnails/10.jpg)
KlassenhierarchieThrowable
Error Exception
VirtualMachineError LinkageError
OutOfMemoryError
RuntimeException
NullpointerException
IOException
FileNotFoundExceptionNoSuchFieldError
unchecked
checked
![Page 11: Exception Handling in Java](https://reader036.vdokument.com/reader036/viewer/2022082613/56815032550346895dbe2e7a/html5/thumbnails/11.jpg)
Die Error-Klasse VirtualMachineError InternalError OutOfMemoryError StackOverflowError UnknownError LinkageError NoSuchMethodError NoSuchFieldError AbstraktMethodError ThreadDeath
Ausnahmen des Typs Error sind nicht vernünftig zu behandeln.
![Page 12: Exception Handling in Java](https://reader036.vdokument.com/reader036/viewer/2022082613/56815032550346895dbe2e7a/html5/thumbnails/12.jpg)
Die Exception Klasse IOException FileNotFoundException SocketException EOFException RemouteException UnknownHostException InterruptedException NoSuchFieldException ClassNotFoundException NoSuchMethodException
Diese Exception müssen behandelt
werden!(ausgenommen RuntimeException)
![Page 13: Exception Handling in Java](https://reader036.vdokument.com/reader036/viewer/2022082613/56815032550346895dbe2e7a/html5/thumbnails/13.jpg)
Exception auf ByteCode Ebene
void f() { try { throw new Exception(); } catch (Exception e) { System.out.println(e); }}
Exception e;e = new Exception();throw e;
0 new #2 <Class Exception> 3 dup 4 invokespecial <init> 7 athrow 8 astore_1 9 getstatic out:System12 aload_113 invokevirtual println16 return
Objekt im Speicher allokierenObjektreferenz auf OperantenStack
Referenzadresse wird dupliziert
Konstruktor wird ausgeführt
Exception Table:
From To Target Type
0 8 8 Exception
Adr.-> Exception
Adr.-> Exception
Operanden-Stack
![Page 14: Exception Handling in Java](https://reader036.vdokument.com/reader036/viewer/2022082613/56815032550346895dbe2e7a/html5/thumbnails/14.jpg)
Beispiel
static int remainder(int dividend, int divisor) throws OverflowException, DivideByZeroException
{ if ((dividend == Integer.MIN_VALUE) && (divisor == -1)) { throw new OverflowException(); } try { return dividend % divisor; } catch (ArithmeticException e) { throw new DivideByZeroException(); }}
Exception Handling wird an die
Vorgängermethode delegiert!
![Page 15: Exception Handling in Java](https://reader036.vdokument.com/reader036/viewer/2022082613/56815032550346895dbe2e7a/html5/thumbnails/15.jpg)
Beispiel 0 iload_0 1 ldc #1 <Integer - 2147483648> 3 if_icmpne 19 6 iload_1 7 iconst_m1 8 if_icmpne 19
11 new #4 <Class OverflowException>
14 dup15 invokespecial #10 <Method
OverflowException()>18 athrow
19 iload_020 iload_121 irem22 ireturn
23 pop24 new #2 <Class DivideByZeroE.>27 dup28 invokespecial #9 <Method
DivideByZeroException()>31 athrow
Exception Table:
From To Target Type
19 23 23 ArithmeticException
static int remainder(int dividend, int divisor)throws OverflowException, DivideByZeroException { if ((dividend == Integer.MIN_VALUE) && (divisor == -1)) { throw new OverflowException(); } try { return dividend % divisor; } catch (ArithmeticException e) { throw new DivideByZeroException(); }}
![Page 16: Exception Handling in Java](https://reader036.vdokument.com/reader036/viewer/2022082613/56815032550346895dbe2e7a/html5/thumbnails/16.jpg)
Danke für die Aufmerksamkeit