Sadegh Aliakbary Sharif University of Technology Fall 2012.

57
Advanced Programming in Java Sadegh Aliakbary Sharif University of Technology Fall 2012

Transcript of Sadegh Aliakbary Sharif University of Technology Fall 2012.

  • Slide 1

Sadegh Aliakbary Sharif University of Technology Fall 2012 Slide 2 Agenda Error handling mechanisms Exception handling framework Benefits of exception handling framework Exception handling in Java Fall 2012Sharif University of Technology2 Slide 3 Watch This Method public static Integer getYear(String day){ String yearString = day.substring(0,4); int year = Integer.parseInt(yearString); return year; } public static void main(String[] args) { String day = "2010/11/29"; Integer year = getYear(day); System.out.println(year); } Fall 2012Sharif University of Technology3 Slide 4 Exceptions What is wrong with it? What if day parameter is not a day representation? day = salam! What if day parameter is malformed? Day = 29 Nov 2010 What if day parameter is empty? String s = ""; What if day parameter is null? These occasions are called Exception Fall 2012Sharif University of Technology4 Slide 5 Handling Exceptions What to do with exceptions? Exit the program Printing the error on console Returning a special value e.g. -1 Fall 2012Sharif University of Technology5 Slide 6 Important Note Sometimes the method cant handle the exception effectively What should a method do when an exception occurs? Exit the program? Suppose you are in a desktop application Excel, Word, a game, Print on console? edu site A game Fall 2012Sharif University of Technology6 Slide 7 Returning a Special Value We can return a special value to report an exception E.g. return null; return -1; return 0; return ; Why not? Fall 2012Sharif University of Technology7 Slide 8 Why not? There is no special value There are many exceptions Ambiguity Need for documentation Combination of program code and exception code Fall 2012Sharif University of Technology8 Slide 9 There is no special value public static int minimum(int[] nums ){ int m = Integer.MAX_VALUE; for (int i : nums) { m = Math.min(m, i); } return m; } int[] array = {1,2,-1}; int minimumFound = minimum(array); Fall 2012Sharif University of Technology9 Slide 10 Exception Handling Exception Handling is a framework for handling exceptions ;-) It simplifies code Separates business code and exception code Fall 2012Sharif University of Technology10 Slide 11 What is an Exception? Exceptional event Error that occurs during runtime Cause normal program flow to be disrupted Examples ? Divide by zero errors Accessing the elements of an array beyond its range Invalid input Hard disk crash Opening a non-existent file Heap memory exhausted Fall 2012Sharif University of Technology11 Slide 12 Default Exception Handling Provided by Java runtime Prints out exception description Prints the stack trace Hierarchy of methods where the exception occurred Causes the program to terminate Fall 2012Sharif University of Technology12 Slide 13 Example 17class DivByZero { 18public static void main(String a[]) { 19System.out.println(3/0); 20} 21} Exception in thread "main" java.lang.ArithmeticException: / by zero at exception.Test2.main(Test2.java:19) Note: Exception is a runtime concept This code has no syntax error (No compile-time error) Fall 2012Sharif University of Technology13 Slide 14 What Happens When an Exception Occurs? When an exception occurs within a method The method creates an exception object And hands it off to the runtime system This job is called throwing an exception Exception object contains information about the error its type the state of the program when the error occurred Exception line of code Fall 2012Sharif University of Technology14 Slide 15 What Happens When an Exception Occurs (2)? The runtime system searches the call stack for a method that contains an exception handler When an appropriate handler is found The runtime system passes the exception to the handler The exception handler catches the exception What if the runtime system can not find an exception handler? Uses the default exception handler Fall 2012Sharif University of Technology15 Slide 16 ` Fall 2012Sharif University of Technology16 Slide 17 Fall 2012Sharif University of Technology17 Slide 18 Exception Handling in Java public static Integer getYear(String day) { String yearString = day.substring(0, 4); int year = Integer.parseInt(yearString); return year; } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("Enter a well-formed date: "); String date = scanner.next(); Integer year = getYear(date); System.out.println(year); } Fall 2012Sharif University of Technology18 Slide 19 getYear() public static Integer getYear(String day) throws Exception { if (day == null) throw new Exception("null value"); if (day.length() == 0) throw new Exception("empty value"); if (!matchesDateFormat(day)) throw new Exception("malformed value"); String yearString = day.substring(0, 4); int year = Integer.parseInt(yearString); return year; } private static boolean matchesDateFormat(String input) { return input.matches("\\d\\d\\d\\d/\\d\\d/\\d\\d"); } Fall 2012Sharif University of Technology19 Slide 20 main() public static void main(String[] args) { Scanner scanner = new Scanner(System.in); boolean ok = false; while (ok == false) { System.out.print("Enter a well-formed date: "); String date = scanner.next(); try { Integer year = getYear(date); System.out.println(year); ok = true; } catch (Exception e) { System.out.println(e.getMessage()); } Fall 2012Sharif University of Technology20 Slide 21 Exception Handling Keywords throw throws a new exception throws Declares exception throw If a method may throw an exception, it should declare it try Start a block with exception handling catch Catch the exception Fall 2012Sharif University of Technology21 Slide 22 Benefits of Exception Handling Framework Separating Error-Handling code from regular business logic code Propagating errors up the call stack Grouping and differentiating error types Fall 2012Sharif University of Technology22 Slide 23 Example Fall 2012Sharif University of Technology23 Slide 24 Separating Error-Handling Code Consider pseudocode method It reads an entire file into memory readFile { open the file; determine its size; allocate that much memory; read the file into memory; close the file; } Fall 2012Sharif University of Technology24 Slide 25 Traditional Programming Fall 2012Sharif University of Technology25 Slide 26 With Exception Handling Framework Fall 2012Sharif University of Technology26 Slide 27 Note You should still write code for detecting, reporting and handling exceptions Exception handling framework is not responsible for these jobs! It only helps you organize the work more effectively Fall 2012Sharif University of Technology27 Slide 28 Propagating Errors Up the Call Stack Traditional approach Each method should explicitly forward the exception Use a special return code Using return type for reporting exceptions Smells bad! New approach Automatic Beautiful! Fall 2012Sharif University of Technology28 Slide 29 Grouping and Differentiating Error Types All exceptions thrown within a program are objects The grouping or categorizing of exceptions is a natural outcome of the class hierarchy Fall 2012Sharif University of Technology29 Slide 30 Fall 2012Sharif University of Technology30 Slide 31 Example class MultipleCatch { public static void main(String args[]) { try { int den = Integer.parseInt(args[0]); System.out.println(3/den); } catch (ArithmeticException exc) { System.out.println(Divisor was 0.); } catch (ArrayIndexOutOfBoundsException exc2) { System.out.println(Missing argument.); } System.out.println(After exception.); } Fall 2012Sharif University of Technology31 Slide 32 Nested Tries class NestedTryDemo { public static void main(String args[]){ try { int a = Integer.parseInt(args[0]); try { int b = Integer.parseInt(args[1]); System.out.println(a/b); } catch (ArithmeticException e) { System.out.println(Div by zero error!"); } } catch (ArrayIndexOutOfBoundsException) { System.out.println(Need 2 parameters!"); } Fall 2012Sharif University of Technology32 Slide 33 Bad Use of Exceptions Dont Use Exception instead of If-else Use exceptions for exceptions! Fall 2012Sharif University of Technology33 Slide 34 Writing Your Own Exceptions Your class should extend Exception class Exception subclasses could be thrown and caught Steps to follow Create a class that extends Exception class Customize the class Members and constructors may be added to the class Exception classes are usually simple classes With no (or few) methods and properties Fall 2012Sharif University of Technology34 Slide 35 Example class HateStringExp extends Exception { /* some code */ } String input = "invalid input"; try { if (input.equals("invalid input")) { throw new HateStringExp(); } System.out.println("Accept string."); } catch (HateStringExp e) { System.out.println("Hate string!); } Fall 2012Sharif University of Technology35 Slide 36 getYear(), revisited public static Integer getYear(String day) throws Exception { if (day == null) throw new NullPointerException (); if (day.length() == 0) throw new EmptyValueException (); if (!matchesDateFormat(day)) throw new MalformedValueException (); String yearString = day.substring(0, 4); int year = Integer.parseInt(yearString); return year; } private static boolean matchesDateFormat(String input) { return input.matches("\\d\\d\\d\\d/\\d\\d/\\d\\d"); } Fall 2012Sharif University of Technology36 Slide 37 Finally try { //.. } catch (ExceptionType e) { // }... } finally { } Contains the code for cleaning up after a try or a catch Fall 2012Sharif University of Technology37 Slide 38 Finally (2) Block of code is always executed Despite of different scenarios: Normal completion Forced exit occurs using a return, a continue or a break statement Caught exception thrown Exception was thrown and caught in the method Uncaught exception thrown Exception thrown was not specified in any catch block in the method Fall 2012Sharif University of Technology38 Slide 39 Fall 2012Sharif University of Technology39 Slide 40 public static int myMethod(int n) { try { switch (n) { case 1: System.out.println("One"); return 1; case 2: System.out.println("Two"); throwMyException(); case 3: System.out.println("Three"); } return 4; } catch (Exception e) { System.out.println("catch"); return 5; } finally { System.out.println("finally"); return 6; } Fall 2012Sharif University of Technology40 class MyException extends Exception {} private static void throwMyException() throws MyException { throw new MyException(); } int a = myMethod(1); System.out.println("myMethod(1)=" + a); a = myMethod(2); System.out.println("myMethod(2)=" + a); a = myMethod(3); System.out.println("myMethod(3)=" + a); Quiz! Slide 41 Result: One finally myMethod(1)=6 Two catch finally myMethod(2)=6 Three finally myMethod(3)=6 Fall 2012Sharif University of Technology41 Slide 42 Unchecked Exceptions private static void function(String[] args) { int den = Integer.parseInt(args[0]); System.out.println(3 / den); } public static void main(String[] args) { function(args); } The method function() may throw exceptions But it has not declared it with throws keyword Why? Because some exceptions are unchecked such as ArithmeticException and ArrayIndexOutOfBoundsException Fall 2012Sharif University of Technology42 Slide 43 Checked and Unchecked Exceptions Checked exception Java compiler checks the program should catch or list the occurring exception If not, compiler error will occur Unchecked exceptions Not subject to compile-time checking for exception handling Built-in unchecked exception classes Error RuntimeException Their subclasses Unchecked exceptions only relax compiler The runtime behavior is the same Fall 2012Sharif University of Technology43 Slide 44 Exception Class Hierarchy Fall 2012Sharif University of Technology44 Slide 45 Exception Classes and Hierarchy Multiple catches should be ordered from subclass to superclass Or else, Compile error: Unreachable catch block class MultipleCatchError { public static void main(String args[]){ try { int a = Integer.parseInt(args [0]); int b = Integer.parseInt(args [1]); System.out.println(a/b); } catch (ArrayIndexOutOfBoundsException e) { //.. } catch (Exception ex) { //.. } Fall 2012Sharif University of Technology45 Slide 46 Exceptions & Inheritance Suppose method f() overrides parents method f() in child class can not throw more exceptions than those of f() in Parent class Less or equal exceptions in throws declaration These mistakes bring compiler error Why? Polymorphic method invocations may cause failure in catching some exceptions Fall 2012Sharif University of Technology46 Slide 47 Example (1) class Parent{ void f(){} } class Child extends Parent{ void f()throws Exception{} } Result? Compiler Error Fall 2012Sharif University of Technology47 Slide 48 Example (2) class Parent{ void f()throws ArithmeticException{} } class Child extends Parent{ void f()throws ArithmeticException, IOException{} } Result? Compiler Error Fall 2012Sharif University of Technology48 Slide 49 Example (3) class Parent{ void f()throws ArithmeticException{} } class Child extends Parent{ void f()throws Exception{} } Result? Compiler Error Fall 2012Sharif University of Technology49 Slide 50 Example (4) class Parent{ void f()throws Exception{} } class Child extends Parent{ void f()throws ArithmeticException{} } Result? No Error Fall 2012Sharif University of Technology50 Slide 51 Conclusion f() in child class can not throw more exceptions Less or equal exceptions in throws declaration f() in child class can not throw more general exceptions f() in child class can throw more specific exceptions Reason: Prevent uncaught exceptions in polymorphic invocations Fall 2012Sharif University of Technology51 Slide 52 Quiz! Fall 2012Sharif University of Technology52 Slide 53 Fall 2012Sharif University of Technology53 Slide 54 interface A { void a(Object o); } interface B { void b(String s); } class C implements A { public void a(Object o) { System.out.println("a() in C"); } public void b(String s) { System.out.println("b() in C"); } class D extends C implements A, B { public void a(Object o) { System.out.println("a() in D"); super.a(o); } public void b(String s) { System.out.println("b() in D"); try{ int parseInt = Integer.parseInt(s); }catch(Exception e){//NumberFormatException throw new BadFormatException(); } Fall 2012Sharif University of Technology54 Output: a() in D a() in C b() in D BadFormatException Good Bye! Output: a() in D a() in C b() in D BadFormatException Good Bye! class BadFormatException extends RuntimeException { } public class Quiz { public static void main(String[] args) { A a1 = new C(); B b1 = new D(); C c1 = new C(); C c2 = new D(); Object o = new String("Twenty Two"); try { f(c2); a1.a(o); c1.a((String)o); b1.b((String)o); c2.a(o); } catch (NumberFormatException e) { System.out.println("NumberFormatException"); } catch (BadFormatException e) { System.out.println("BadFormatException"); } catch (Exception e) { System.out.println("Exception"); }finally{ System.out.println("Good Bye!"); } public static void f(A a) { a.a(a); } Slide 55 Further Reading Throwable and Error classes Assertions assert name!=null; Fall 2012Sharif University of Technology55 Slide 56 References http://www.javapassion.com/javase/javaexceptions.pdf Fall 2012Sharif University of Technology56 Slide 57 Fall 2012Sharif University of Technology57