Java Exceptions
Java Exceptions
Topics
What is an Exception? What happens when an Exception occurs? Benefits of Exception Handling framework Catching exceptions with try-catch Catching exceptions with finally Throwing exceptions Rules in exception handling Exception class hierarchy Checked exception and unchecked exception Creating your own exception class Assertions
What is an Exception?
3
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
4
Exception Example
1 2 3 4 5 6
class DivByZero { public static void main(String args[]) { System.out.println(3/0); System.out.println(Pls. print me.); } }
When an exception occurs within a method, the method creates an exception object and hands it off to the runtime system
Creating an exception object and handing it to the runtime system is called throwing an exception Exception object contains information about the error, including its type and the state of the program when the error occurred
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
An exception handler is considered appropriate if the type of the exception object thrown matches the type that can be handled by the handler The exception handler chosen is said to catch the exception.
If the runtime system exhaustively searches all the methods on the call stack without finding an appropriate exception handler, the runtime system (and, consequently, the program) terminates and uses the default exception handler
10
11
Separating Error-Handling code from regular business logic code Propagating errors up the call stack Grouping and differentiating error types
13
In traditional programming, error detection, reporting, and handling often lead to confusing spaghetti code Consider pseudocode method here that 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; }
14
In traditional programming, To handle such cases, the readFile function must have more code to do error detection, reporting, and handling.
errorCodeType readFile { initialize errorCode = 0; open the file; if (theFileIsOpen) { determine the length of the file; if (gotTheFileLength) { allocate that much memory; if (gotEnoughMemory) { read the file into memory; if (readFailed) { errorCode = -1; } } else { errorCode = -2; }
15
} else { errorCode = -3; } close the file; if (theFileDidntClose && errorCode == 0) { errorCode = -4; } else { errorCode = errorCode and -4; } } else { errorCode = -5; } return errorCode; }
16
Exceptions enable you to write the main flow of your code and to deal with the exceptional cases elsewhere
readFile { try { open the file; determine its size; allocate that much memory; read the file into memory; close the file; } catch (fileOpenFailed) { doSomething; } catch (sizeDeterminationFailed) { doSomething; } catch (memoryAllocationFailed) { doSomething; } catch (readFailed) { doSomething; } catch (fileCloseFailed) { doSomething; } }
17
Note that exceptions don't spare you the effort of doing the work of detecting, reporting, and handling errors, but they do help you organize the work more effectively.
18
Suppose that the readFile method is the fourth method in a series of nested method calls made by the main program: method1 calls method2, which calls method3, which finally calls readFile Suppose also that method1 is the only method interested in the errors that might occur within readFile.
method1 { call method2; } method2 { call method3; } method3 { call readFile; }
19
Traditional errornotification techniques force method2 and method3 to propagate the error codes returned by readFile up the call stack until the error codes finally reach method1the only method that is interested in them.
20
A method can duck any exceptions thrown within it, thereby allowing a method farther up the call stack to catch it. Hence, only the methods that care about errors have to worry about detecting errors Any checked exceptions that can be thrown within a method must be specified in its throws clause.
21
Because all exceptions thrown within a program are objects, the grouping or categorizing of exceptions is a natural outcome of the class hierarchy An example of a group of related exception classes in the Java platform are those defined in java.io IOException and its descendants
IOException is the most general and represents any type of error that can occur when performing I/O Its descendants represent more specific errors. For example, FileNotFoundException means that a file could not be located on disk.
22
A method can write specific handlers that can handle a very specific exception The FileNotFoundException class has no descendants, so the following handler can handle only one type of exception.
catch (FileNotFoundException e) { ... }
23
A method can catch an exception based on its group or general type by specifying any of the exception's superclasses in the catch statement. For example, to catch all I/O exceptions, regardless of their specific type, an exception handler specifies an IOException argument.
// Catch all I/O exceptions, including // FileNotFoundException, EOFException, and so on. catch (IOException e) { ... }
24
Syntax:
try { <code to be monitored for exceptions> } catch (<ExceptionType1> <ObjName>) { <handler if ExceptionType1 occurs> } ... } catch (<ExceptionTypeN> <ObjName>) { <handler if ExceptionTypeN occurs> }
26
class DivByZero { public static void main(String args[]) { try { System.out.println(3/0); System.out.println(Please print me.); } catch (ArithmeticException exc) { //Division by zero is an ArithmeticException System.out.println(exc); } System.out.println(After exception.); } }
27
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.); } }
28
30
class NestedTryDemo2 { static void nestedTry(String args[]) { try { int a = Integer.parseInt(args[0]); int b = Integer.parseInt(args[1]); System.out.println(a/b); } catch (ArithmeticException e) { System.out.println("Div by zero error!"); } } //continued...
31
public static void main(String args[]){ try { nestedTry(args); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("Need 2 parameters!"); } } }
32
Syntax:
try { <code to be monitored for exceptions> } catch (<ExceptionType1> <ObjName>) { <handler if ExceptionType1 occurs> } ... } finally { <code to be executed before the try block ends> }
Forced exit occurs using a return, a continue or a break statement Normal completion Caught exception thrown
Exception was thrown and caught in the method Exception thrown was not specified in any catch block in the method
35
class FinallyDemo { static void myMethod(int n) throws Exception{ try { switch(n) { case 1: System.out.println("1st case"); return; case 3: System.out.println("3rd case"); throw new RuntimeException("3!"); case 4: System.out.println("4th case"); throw new Exception("4!"); case 2: System.out.println("2nd case"); } //continued...
36
37
public static void main(String args[]){ for (int i=1; i<=4; i++) { try { FinallyDemo.myMethod(i); } catch (Exception e){ System.out.print("Exception caught: "); System.out.println(e.getMessage()); } System.out.println(); } } }
38
Throwing Exceptions
39
You have to create an exception object in the same way you create any other object
Example:
throw new ArithmeticException(testing...);
40
class ThrowDemo { public static void main(String args[]){ String input = invalid input; try { if (input.equals(invalid input)) { throw new RuntimeException("throw demo"); } else { System.out.println(input); } System.out.println("After throwing"); } catch (RuntimeException e) { System.out.println("Exception caught:" + e); } } }
41
Rules on Exceptions
If a method may cause an exception to occur but does not catch it, then it must say so using the throws keyword
Syntax:
<type> <methodName> (<parameterList>) throws <exceptionList> { <methodBody> }
43
class ThrowingClass { static void meth() throws ClassNotFoundException { throw new ClassNotFoundException ("demo"); } } class ThrowsDemo { public static void main(String args[]) { try { ThrowingClass.meth(); } catch (ClassNotFoundException e) { System.out.println(e); } } }
44
Throwable class
Error Exception
Exception class
Conditions that user programs can reasonably deal with Usually the result of some flaws in the user program code Examples
46
Error class
Used by the Java run-time system to handle errors occurring in the run-time environment Generally beyond the control of user programs Examples
47
48
1 2 3 4 5 6 7 8 9
10
11
Checked exception
Java compiler checks if the program either catches or lists the occurring checked exception If not, compiler error will occur Not subject to compile-time checking for exception handling Built-in unchecked exception classes Error RuntimeException Their subclasses Handling all these exceptions may make the program cluttered and may become a nuisance
Unchecked exceptions
51
Steps to follow
Create a class that extends the RuntimeException or the Exception class Customize the class
Example:
1 2 3
53
class TestHateString { public static void main(String args[]) { 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!); } } }
54
Assertions
55
Example: month
Extension of comments wherein the assert statement informs the person reading the code that a particular condition should always be satisfied
Running the program informs you if assertions made are true or not If an assertion is not true, an AssertionError is thrown
Program with assertions may not work properly if used by clients not aware that assertions were used in the code Compiling
Enabling assertions:
Assert Syntax
Two forms:
Simpler form:
assert <expression1>; where
Other form:
assert <expression1> : <expression2>; where
<expression1> is the condition asserted to be true <expression2> is some information helpful in diagnosing why the statement failed
58
Assert Syntax
1 2 3 4 5 6 7 8 9 10
class AgeAssert { public static void main(String args[]) { int age = Integer.parseInt(args[0]); assert(age>0); /* if age is valid (i.e., age>0) */ if (age >= 18) { System.out.println(You're an adult! =)); } } }
59
Thank You!
60