Peyman Dodangeh Sharif University of Technology Spring
2015
Slide 2
Agenda Error handling mechanisms Exception handling framework
Benefits of exception handling framework Exception handling in Java
Spring 2015Sharif 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); } Spring 2015Sharif
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 Spring 2015Sharif 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 Spring 2015Sharif 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 Spring 2015Sharif
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? Spring 2015Sharif 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 Spring 2015Sharif 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); Spring 2015Sharif University of Technology9
Slide 10
Exception Handling Exception Handling is a framework for
handling exceptions ;-) It simplifies code Separates business code
and exception code Spring 2015Sharif 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 Spring 2015Sharif 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 Spring
2015Sharif 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)
Spring 2015Sharif 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
Spring 2015Sharif 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 Spring 2015Sharif
University of Technology15
Slide 16
` Spring 2015Sharif University of Technology16
Slide 17
Spring 2015Sharif 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); } Spring 2015Sharif 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"); } Spring 2015Sharif
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()); } Spring 2015Sharif 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 Spring 2015Sharif 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
Spring 2015Sharif University of Technology22
Slide 23
Example Spring 2015Sharif 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; } Spring 2015Sharif University of
Technology24
Slide 25
Traditional Programming Spring 2015Sharif University of
Technology25
Slide 26
With Exception Handling Framework Spring 2015Sharif 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 Spring 2015Sharif 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! Spring 2015Sharif 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 Spring
2015Sharif University of Technology29
Slide 30
Spring 2015Sharif 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.); } Spring
2015Sharif 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!"); } Spring 2015Sharif
University of Technology32
Slide 33
Bad Use of Exceptions Dont Use Exception instead of If-else Use
exceptions for exceptions! Spring 2015Sharif 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 Spring 2015Sharif 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!); } Spring 2015Sharif 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"); } Spring 2015Sharif
University of Technology36
Slide 37
Finally try { //.. } catch (ExceptionType e) { // }... }
finally { } Contains the code for cleaning up after a try or a
catch Spring 2015Sharif 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 Spring 2015Sharif University of Technology38
Slide 39
Spring 2015Sharif 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; } Spring 2015Sharif
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 Spring 2015Sharif
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
Spring 2015Sharif 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 Spring 2015Sharif University of
Technology43
Slide 44
Exception Class Hierarchy Spring 2015Sharif 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) { //.. } Spring 2015Sharif 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 Spring 2015Sharif University of Technology46
Slide 47
Example (1) class Parent{ void f(){} } class Child extends
Parent{ void f()throws Exception{} } Result? Compiler Error Spring
2015Sharif 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 Spring 2015Sharif University
of Technology48
Slide 49
Example (3) class Parent{ void f()throws ArithmeticException{}
} class Child extends Parent{ void f()throws Exception{} } Result?
Compiler Error Spring 2015Sharif University of Technology49
Slide 50
Example (4) class Parent{ void f()throws Exception{} } class
Child extends Parent{ void f()throws ArithmeticException{} }
Result? No Error Spring 2015Sharif 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 Spring 2015Sharif University of
Technology51
Slide 52
Quiz! Spring 2015Sharif University of Technology52
Slide 53
Spring 2015Sharif 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(); } Spring
2015Sharif 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; Spring 2015Sharif University of Technology55
Slide 56
References http://www.javapassion.com/javase/javaexceptions.pdf
Spring 2015Sharif University of Technology56