1 / 16

Exception Handling in Java

Exception Handling in Java. Seminar aus Softwareentwicklung Norbert Wiener. Ziele von Exception Handling. Programme robuster machen gegen: • fehlerhafte Eingaben • Gerätefehler (Defekte, Platte voll, ...) • Programmierfehler (z.B. Division durch 0)

chaney
Download Presentation

Exception Handling in Java

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. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Exception Handling in Java Seminar aus Softwareentwicklung Norbert Wiener

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

  3. 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; }

  4. try-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.

  5. 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 123 i= 123 finally! Catch xy kein int-Wert! finally! Catch Parameter vergessen! finally! Finally wird immer ausgeführt!

  6. Ausnahme-Klasse definieren class MyException extends Exception{ public MyException() { super(); } public MyException(String msg) { super(msg); } } class MyException extends Exception{ } Eigener Exceptiontyp (indirekt) von Throwable ableiten. Konstuktor ohne Parameter Konstruktor mit Fehlermeldung

  7. Die throws-Klausel setPassword(String pw){ try{ if(pw.length() < 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() < 5){ throw new Exception(„Fehler“); }.......} Try{ setPassword(pw);}catch(Exception e){ Ausnahme behandeln!}

  8. throws Beispiel 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"); } } ..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"); } } x=1 finB finA Main x=2 finB A finA x=3 B finB finA x=4 C finB finA

  9. Debugging von Ausnahmen finB finA Main Fehler! 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) 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(); } } }

  10. Klassenhierarchie Throwable Error Exception VirtualMachineError LinkageError RuntimeException IOException NullpointerException FileNotFoundException OutOfMemoryError NoSuchFieldError unchecked checked

  11. VirtualMachineError InternalError OutOfMemoryError StackOverflowError UnknownError LinkageError NoSuchMethodError NoSuchFieldError AbstraktMethodError ThreadDeath Die Error-Klasse Ausnahmen des Typs Error sind nicht vernünftig zu behandeln.

  12. IOException FileNotFoundException SocketException EOFException RemouteException UnknownHostException InterruptedException NoSuchFieldException ClassNotFoundException NoSuchMethodException Diese Exception müssen behandelt werden! (ausgenommen RuntimeException) Die Exception Klasse

  13. Exception auf ByteCode Ebene void f() { try { throw new Exception(); } catch (Exception e) { System.out.println(e); } } Exception e; e = new Exception(); throw e; Adr.-> Exception Adr.-> Exception Operanden-Stack Objekt im Speicher allokieren Objektreferenz auf OperantenStack 0new #2 <ClassException>3dup4invokespecial <init>7athrow8astore_19getstatic out:System12 aload_113 invokevirtual println16 return Referenzadresse wird dupliziert Konstruktor wird ausgeführt Exception Table: From To Target Type 0 8 8 Exception

  14. 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!

  15. 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 dup 15 invokespecial #10 <Method OverflowException()> 18 athrow 19 iload_0 20 iload_1 21 irem 22 ireturn 23 pop 24 new #2 <ClassDivideByZeroE.> 27 dup 28 invokespecial #9 <Method DivideByZeroException()> 31 athrow 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

  16. Danke für die Aufmerksamkeit

More Related