Download Exception Handling Reading

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
Exception Handling
1
Liang, Introduction to Java Programming, Eighth Edition, (c) 2011 Pearson Education, Inc. All
rights reserved. 0132130807
Reading
 Chapter13
2
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
Motivation
 When a program runs into a runtime error, the program
terminates abnormally
 How
H can you hhandle
dl th
the runtime
ti error so that
th t th
the program
can continue to run or terminate gracefully?
 Have you seen errors that were not handled (e.g.,
FileNotFoundException)?
3
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
Objectives
 Understand exceptions and exception handling (§13.2).
 Explore the advantages of using exception handling (§13.3).
 Distinguish exception types: Error (fatal) vs. Exception
(nonfatal), and checked vs. unchecked (§13.4).
 Understand exception programming(§13.5-13.6).
 Separate regular programming from exception programming
(§13.7).
 Advanced
Ad
d exception
ti programming
i (§13
(§13.8-13.10).
8 13 10)
4
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
Example
What is the best way to handle errors?
 Consider this program which might fail
package lectures;
import
p
j
java.util.Scanner;
;
public class Quotient {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("Enter 2 integers: ");
int number1 = input.nextInt();
int number2 = input.nextInt();
System.out.println(number1 + " / " +
number2
b 2 + " i
is " + (
(number1
b 1 / number2)));
b 2)))
}
run:
}
5
Enter 2 integers: 3 0
Exception in thread "main" java.lang.ArithmeticException: / by
zero at lectures.Quotient.main(Quotient.java:12)
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
Exception Handling Advantages
 Separates the detection of an error from the handing of an
error
 Makes
M k code
d more readable
d bl (i.e.,
(i maintainable)
i t i bl )
 Method can just report an error and then request that the
calling method handle the error (makes code more reusable)
6
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
Example slide
 Notice that the Java API includes classes whose methods can
throw exceptions
7
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
Example
 Consider the exception handling approach
package lectures;
import java
java.util.Scanner;
util Scanner;
import java.io.*;
public class FileNotFoundExceptionDemo {
public static void main(String[] args) {
Scanner inputFromConsole = new Scanner(System.in);
System.out.print("Enter a file name: ");
String fileName = inputFromConsole.nextLine();
try {
Scanner inputFromFile =
new
e Scanner(new
ca e ( e File(fileName));
e(
e a e));
System.out.println(
"File " + fileName + " exists");
} catch (FileNotFoundException ex) {
System.out.println("Exception: " + fileName + "
not found");
}}}
8
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
Example – Better Approach
 Your exception handler can correct the error, as in
try {
Scanner inputFromFile = new Scanner(new File(fileName));
System.out.println("File " + fileName + " exists");
} catch (FileNotFoundException ex) {
System.out.println(
"Exception: " + fileName + " not found");
System.out.println("Please reenter file name");
fileName = inputFromConsole.nextLine();
}
9
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
Exception Categories
 Exceptions are objects (check out the Java API)
 Exception categories
 SSystem errors – internal
i
l system errors ((rarely
l encountered)
d)
 Examples – LinkageError and VirtualMachineError
 Exceptions – errors that can be caught and handled by your
program
 Runtime exceptions – programming errors (e.g., out-of-bounds
reference to an array, divide an integer by 0)
10
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
Exceptions
Exceptions - can be
caught and handled
by your program
RuntimeException – caused
by programming errors
ClassNotFoundException
ArithmeticException
IOException
Exception
NullPointerException
RuntimeException
IndexOutOfBoundsException
Many more classes
Object
IllegalArgumentException
Throwable
Many more classes
LinkageError
Error
VirtualMachineError
Many more classes
Error - thrown by JVM, and not much you can do about them
11
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
Notes on Exception Hierarchy
 Names are a bit confusing – Error, Exception, and
RuntimeException are all exceptions – and all occur at
runtime
 Throwable class is the root of exception classes
 Create your own Exception by extending Exception (or one
of its subclasses)
 No exception for integer overflow
12
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
Checked Exception
 If you did not handle the FileNotFound exception, the Java
compiler would object (and maybe suggest options)
13
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
Checked vs. Unchecked Exceptions
 Checked means that the compiler forces you to deal with the
exceptions (either handle the exception or re-throw it)
 RuntimeException
R ti E
ti - Error
E
andd their
th i subclasses
bl
are kknown as
unchecked exceptions
 Programming errors that are mostly unrecoverable
 If they were checked, programs would be overwhelmed with
try/catch blocks
14
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
Unchecked Exceptions
 In most cases, unchecked exceptions reflect programming
logic errors that are not recoverable
 Examples
 NullPointerException - you access a null object
 IndexOutOfBoundsException - you access an element in an array
outside the bounds of the array
 ArithmeticException – e.g., divide an integer by zero
 Logic errors that should be corrected in the program
 To avoid overuse of try-catch blocks, Java does not mandate
code to catch unchecked exceptions
15
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
Exception Operations
 Declaring
 Throwing
 Catching
public void myMethod()
throws IOException, MyException {...
...
throw new MyException();
try {...}
catch(Exception e){
e){...}
}
16
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
Declaring Exceptions
 Every method must state the types of checked exceptions it
might throw (declaring exceptions)
 No
N requirement
i
t tto ddeclare
l unchecked
h k d exceptions
ti
public void myMethod()
throws IOException {...}
public void myMethod()
throws IOException, OtherException {...}
Multiple exceptions
Throws keyword indicates that myMethod
might throw an IOException
17
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
Creating Exception Classes
 You can create your own exception class by:
 Deriving it from Exception
 Deriving
D i i it ffrom a child
hild off E
Exception
ti
package progex.chapter13;
public class IllegalTriangleException extends Exception
{
public IllegalTriangleException() {
}
public IllegalTriangleException(String gripe) {
super(gripe);
}
}
18
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
Throwing Exceptions
 When a program detects an error, the program can create an
instance of an appropriate exception type and throw it
(throwing an exception)
 Example
throw new TheException();
or
throw new TheException(“this
TheException( this is a message”);
message );
Exceptions have two constructors – a zero
parameter constructor and one with a “message”
19
Your handler will frequently extract the message
from the exception
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
Throwing Exceptions Example
/** Set a new radius */
public void setRadius(double newRadius)
throws IllegalArgumentException {
if (
(newRadius
R di
>
>= 0)
radius = newRadius;
else
throw new IllegalArgumentException(
"Radius cannot be negative");
}
Older programming languages used awkward
constructs (e.g., parameters and return values)
to indicate errors
20
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
Catching Exceptions
 To catch and handle an exception, use a try/catch block
 Syntax
If no exceptions are thrown, the catch
bl k is
block
i skipped
ki d
try {
statements; // may throw exceptions
}
catch (Exception1 exVar1) {
handler for exception1
Order of catch blocks is
}
important – i.e., subtypes first
...
catch (ExceptionN exVarN) {
handler for exceptionN
}
If a statement in the try block throws an exception, the
remaining statements in the try block are skipped
21
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
Catching Exceptions
You will see this in
a stack trace
 The exception (if not immediately handled) is propagated
backward through the chain of method calls
main method {
...
try {
...
invoke method1;
statement1;
}
catch (Exception1 ex1) {
Process ex1;
}
statement2;
}
method1 {
...
try {
...
invoke method2;
statement3;
}
catch (Exception2 ex2) {
Process ex2;
}
statement4;
}
method2 {
...
try {
...
invoke method3;
statement5;
}
catch (Exception3 ex3) {
Process ex3;
}
statement6;
}
Call Stack
method3
main method
22
method2
method2
method1
method1
method1
main method
main method
main method
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
An exception
is thrown in
method3
Notes on Catching Exceptions
 Use a superclass to catch sub-class exceptions
 Example
Catch (Exception e) {}
will catch an IOException
 When listing multiple catches, list the more specific catches
last (e.g., catch Exception last)
23
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
Deal With Checked Exceptions
 Java forces you to deal with checked exceptions
 You must invoke it in a try-catch block or declare to throw
the exception
th
ti in
i th
the calling
lli method
th d
 Example - method p1 invokes method p2, and p2 may throw
a checked exception (e.g., IOException), you have to write
the code as shown in (a) or (b).
void p1() {
try {
p2();
p
();
}
catch (IOException ex) {
...
}
}
(a)
24
void p1() throws IOException
p2();
}
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
(b)
Getting Exception Information
 Throwable class contains helpful methods
 getMessage – returns the exception message
 toString
t St i – concatenates
t t the
th full
f ll name off th
the exception
ti class
l andd
the exception message
 getStackTrace – returns an array of stack trace elements
 printStackTrace – prints the exception object and its call stack
trace to the console
25
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
Example
Main calls method1, which propagates
an exception back to main
 Consider throwing and exception to a calling method
public class ExampleStackTrace {
public static void main(String[] args) {
Scanner inputFromConsole = new Scanner(System.in);
System.out.print("Enter a file name: ");
String fileName = inputFromConsole.nextLine();
try {
method1(fileName);
System.out.println("File " + fileName + " exists");
} catch (FileNotFoundException ex) {
System.out.println("Exception: " + fileName+" not found");
ex.printStackTrace();
}
}
public static void method1(String fileName)
throws FileNotFoundException {
Scanner inputFromFile = new Scanner(new File(fileName));}}
26
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
Example
 The stack trace generated by the handler is
run:
Enter a file name: test
Exception: test not found
java.io.FileNotFoundException: test (Access is denied)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:106)
at java.util.Scanner.<init>(Scanner.java:636)
at lectures.ExampleStackTrace.method1(ExampleStackTrace.java:22)
at lectures.ExampleStackTrace.main(ExampleStackTrace.java:13)
BUILD SUCCESSFUL (
(total time: 4 seconds)
)
27
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
The finally Clause
 Use a finally clause to execute code whether or not an
exception is thrown
try {
statements;
}
catch(TheException ex) {
handling ex;
}
finally {
finalStatements;
}
28
finallyy block executes even if
there is a return statement prior
to reaching the finally block
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
Rethrowing Exceptions
 An exception handler can re-throw an exception
try {
statements;
}
catch(TheException ex) {
perform operations before exits;
throw ex;
}
29
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
animation
Trace a Program Execution
try {
statements;
}
catch(TheException ex) {
handling ex;
}
finally {
finalStatements;
}
Next statement;
30
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
Suppose no
exceptions in the
statements, catch
block is not executed
and …
animation
Trace a Program Execution
try {
statements;
}
catch(TheException ex) {
handling ex;
}
finally {
finalStatements;
}
The final block is
always executed
Next statement;
31
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
animation
Trace a Program Execution
try {
statements;
}
catch(TheException ex) {
handling ex;
}
finally {
finalStatements;
}
Next statement in the
method is executed
Next statement;
32
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
animation
Trace a Program Execution
try {
statement1;
statement2;
statement3;
}
catch(Exception1 ex) {
handling ex;
}
finally {
;
finalStatements;
}
Suppose an exception
of type Exception1 is
thrown in statement2,
statement3 is not
executed and …
Next statement;
33
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
animation
Trace a Program Execution
try {
statement1;
statement2;
statement3;
}
catch(Exception1 ex) {
handling ex;
}
finally {
;
finalStatements;
}
Next statement;
34
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
The exception is
handled.
animation
Trace a Program Execution
try {
statement1;
statement2;
statement3;
}
catch(Exception1 ex) {
handling ex;
}
finally {
;
finalStatements;
}
The final block is
always executed.
Next statement;
35
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
animation
Trace a Program Execution
try {
statement1;
statement2;
statement3;
}
catch(Exception1 ex) {
handling ex;
}
finally {
;
finalStatements;
}
Next statement;
36
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
The next statement in
the method is now
executed.
animation
Trace a Program Execution
try {
statement1;
statement2;
statement3;
}
catch(Exception1 ex) {
handling ex;
}
catch(Exception2 ex) {
handling ex;
throw ex;
}
finally {
finalStatements;
}
Exception1 is not a
parent class of
Exception2
statement2 throws an
exception of type
Exception2.
Exception1 handler is
not executed, and …
Next statement;
37
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
animation
Trace a Program Execution
try {
statement1;
statement2;
statement3;
}
catch(Exception1 ex) {
handling ex;
}
catch(Exception2 ex) {
handling ex;
throw ex;
}
finally {
finalStatements;
}
Handling exception
Next statement;
38
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
animation
Trace a Program Execution
try {
statement1;
statement2;
statement3;
}
catch(Exception1 ex) {
handling ex;
}
catch(Exception2 ex) {
handling ex;
throw ex;
}
finally {
finalStatements;
}
Execute the final block
Next statement;
39
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
animation
Trace a Program Execution
try {
statement1;
statement2;
statement3;
}
catch(Exception1 ex) {
handling ex;
}
catch(Exception2 ex) {
handling ex;
throw ex;
}
finally {
finalStatements;
}
Next statement;
40
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
Rethrow the exception
and control is
transferred to the caller
Cautions When Using Exceptions
 Exception handling separates error-handling code from
normal programming tasks, thus making programs easier to
read and to modify
 Be aware, however, that exception handling usually requires
more time and resources because it requires
 instantiating a new exception object
 rolling back the call stack
p
propagating
p g g the errors to the callingg methods.
41
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
When to Throw Exceptions
 An exception occurs in a method
 If you want the exception to be processed by its caller, you
should
h ld create
t an exception
ti object
bj t andd throw
th
it
 If you can handle the exception in the method where it
occurs, there is no need to throw it
42
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
When to Use Exceptions
 Unexpected situations
 Example – correct, but not good style
try {
System.out.println(refVar.toString()); }
catch (NullPointerException ex) {
System.out.println("refVar is null"); }
 Example – correct, better style
if (refVar != null)
System.out.println(refVar.toString());
else
System.out.println("refVar is null");
43
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
Defining Custom Exception Classes
 Use the exception classes in the API whenever possible.
 Define custom exception classes if the predefined classes are
nott sufficient.
ffi i t
 Define custom exception classes by extending Exception or a
subclass of Exception.
44
(c) 2011 Pearson Education, Inc.& Robert F. Kelly
Have You Satisfied Objectives?
 Understand exceptions and exception handling (§13.2).
 Explore the advantages of using exception handling (§13.3).
 Distinguish exception types: Error (fatal) vs. Exception
(nonfatal), and checked vs. unchecked (§13.4).
 Understand exception programming(§13.5-13.6).
 Separate regular programming from exception programming
(§13.7).
 Advanced
Ad
d exception
ti programming
i (§13
(§13.8-13.10).
8 13 10)
45
(c) 2011 Pearson Education, Inc.& Robert F. Kelly