Title: Exception Handling in Java
1Exception Handling in Java
- Seminar aus Softwareentwicklung
- Norbert Wiener
2Ziele 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
3Auslösen von Exception
- explizite Ausnahmen throw Anweisung im
Code. - implizite Ausnahmen durch die JVM- Divison durch
0 gt ArithmeticException- Zugriff
über null-Ref. gt NullPointerException-
Ungültige Konvertierung gt ClassCastException
setPassword(String pw) ......
if(pw.length() lt 5) throw new Exception(mind. 5
Zeichen) .......
int intDiv (int i, int j) return i/j
4try-catch-finally Syntax
- try
- Anweisungen
- catch (Ausnahme1 a1)
- Fehlerbehandlung1
- catch (Ausnahme2 a2)
- Fehlerbehandlung2
- finally
- Aufräumen
Nach einem try-Block muss mindestens ein
catch-Block folgen!
Der finally-Block ist optional
Bei mehreren catch-Blöcken beginnt die Suche der
Ausnahmenbehandlung von oben nach unten.
5Beispiel
- class Catch
- public static void main(String args)
- try
- int i Integer.parseInt(args0)
- 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 123 i 123 finally! Catch xy kein
int-Wert! finally! Catch Parameter vergessen!
finally!
Finally wird immer ausgeführt!
6Ausnahme-Klasse definieren
Eigener Exceptiontyp (indirekt) von Throwable
ableiten.
- class MyException extends Exception
-
- class MyException extends Exception
- public MyException()
- super()
-
- public MyException(String msg)
- super(msg)
-
Konstuktor ohne Parameter
Konstruktor mit Fehlermeldung
7Die throws-Klausel
setPassword(String pw) try
if(pw.length() lt 5) throw new
Exception(Fehler)
catch(Exception e) Ausnahme behandeln!
- Weitergabe der Exception an die aufrufende Methode
static setPassword(String pw)
throws Exception if(pw.length() lt 5)
throw new Exception(Fehler) .......
Try setPassword(pw)catch(Exception e)
Ausnahme behandeln!
8throws Beispiel
C(int x) throws Exc1, Exc2 ,Exc3 try
if(x1) throw new
Exc1("F.") else if(x2)
throw new Exc2() else if(x3)
throw new Exc3() else
throw new Exc4() catch(Exc4 e)
....println("C")
........ 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")
- ..Main(...)
- ......
- try
- A(x)
- catch(Exc1 e)
- ..print("Main")
-
- ........
x1 finB finA Main
x2 finB A finA
x3 B finB finA
x4 C finB finA
9Debugging von Ausnahmen
e.getMessage() e.printStackTrace()
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()
- finB
- finA
- Main
- Fehler!
- Exc1 Fehler!
- at C.ltinitgt(C.java6)
- at B.ltinitgt(B.java4)
- at A.ltinitgt(A.java4)
- at Test.main(Test.java6)
10Klassenhierarchie
Throwable
Error
Exception
VirtualMachineError
LinkageError
RuntimeException
IOException
NullpointerException
FileNotFoundException
OutOfMemoryError
NoSuchFieldError
unchecked
checked
11Die Error-Klasse
- VirtualMachineError
- InternalError
- OutOfMemoryError
- StackOverflowError
- UnknownError
- LinkageError
- NoSuchMethodError
- NoSuchFieldError
- AbstraktMethodError
- ThreadDeath
Ausnahmen des Typs Error sind nicht vernünftig zu
behandeln.
12Die Exception Klasse
- IOException
- FileNotFoundException
- SocketException
- EOFException
- RemouteException
- UnknownHostException
- InterruptedException
- NoSuchFieldException
- ClassNotFoundException
- NoSuchMethodException
- Diese Exception müssen behandelt werden!
- (ausgenommen RuntimeException)
13Exception auf ByteCode Ebene
- void f()
- try
- throw new Exception()
- catch (Exception e)
- System.out.println(e)
-
Exception e e new Exception() throw e
Adr.-gt Exception
Adr.-gt Exception
Operanden-Stack
Objekt im Speicher allokieren Objektreferenz auf
OperantenStack
0 new 2 ltClass Exceptiongt 3 dup 4
invokespecial ltinitgt 7 athrow 8 astore_1 9
getstatic outSystem12 aload_113
invokevirtual println16 return
Referenzadresse wird dupliziert
Konstruktor wird ausgeführt
Exception Table From To Target Type 0
8 8 Exception
14Beispiel
- static int remainder(int dividend, int divisor)
- throws OverflowException, DivideByZeroExceptio
n - 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!
15Beispiel
- 0 iload_0
- 1 ldc 1 ltInteger - 2147483648gt
- 3 if_icmpne 19
- 6 iload_1
- 7 iconst_m1
- 8 if_icmpne 19
- 11 new 4 ltClass OverflowExceptiongt
- 14 dup
- 15 invokespecial 10 ltMethod OverflowException()gt
- 18 athrow
- 19 iload_0
- 20 iload_1
- 21 irem
- 22 ireturn
- 23 pop
- 24 new 2 ltClass DivideByZeroE.gt
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 Table From To Target
Type 19 23 23
ArithmeticException
16Danke für die Aufmerksamkeit