Object-Oriented Programming - Lecture 6: Exceptions - Lê Hồng Phương
✦ What is an exception? ✦ Catching and handling exceptions ✦ Specifying the exceptions thrown by a method ✦ How to throw exceptions ✦ Advantages of exceptions ✦ Exercises
Bạn đang xem trước 20 trang tài liệu Object-Oriented Programming - Lecture 6: Exceptions - Lê Hồng Phương, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
August 2012
Object-Oriented Programming
Lecture 6: Exceptions
Dr. Lê H!ng Ph"#ng -- Department of Mathematics, Mechanics and Informatics, VNUH
1
Thursday, August 9, 12
Content
✦ What is an exception?
✦ Catching and handling exceptions
✦ Specifying the exceptions thrown by a method
✦ How to throw exceptions
✦ Advantages of exceptions
✦ Exercises
2
Thursday, August 9, 12
What is an exception?
✦ An exception is an event, which occurs during the execution of a
program, that disrupts the normal flow of the program’s instructions.
✦ When an exception occurs within a method, the method creates an
exception object and hands it off to the runtime system.
✦ The exception object contains information about the error (its type,
the state of the program when the error occurred).
✦ Creating an exception object and handing it to the runtime system is
called throwing an exception.
3
Thursday, August 9, 12
What is an exception?
✦ When an exception is thrown, the
runtime system attempts to find
something to handle it.
✦ A set of possible “somethings” is the
ordered list of methods that had been
called to get to the method where the
error occurred.
✦ This list of methods is known as call
stack.
4
Thursday, August 9, 12
What is an exception?
✦ The runtime system searches the call stack for a method that can handle the
exception.
✦ The block of code that handles the exception is called exception handler.
✦ The type of exception object thrown must match the type that can be
handled by the handler.
✦ When the handler is found, the runtime passes the exception to the handler.
5
Thursday, August 9, 12
Content
✦ What is an exception?
✦ Catching and handling exceptions
✦ Specifying the exceptions thrown by a method
✦ How to throw exceptions
✦ Advantages of exceptions
✦ Exercises
6
Thursday, August 9, 12
Catching and handling exceptions
✦ 3 exception handler components: try, catch and finally blocks.
✦ An example: ListOfNumbers
✦ Creates an ArrayList that contains 10 Integer elements;
✦ Specifies a methods named writeList() which writes the list to a text
file called output.txt.
7
Thursday, August 9, 12
Catching and handling exceptions
public class ListOfNumbers {
private List list;
private static final int SIZE = 10;
public ListOfNumbers() {
list = new ArrayList(SIZE);
for (int i = 0; i < SIZE; i++) {
list.add(new Integer(i));
}
}
public void writeList() {
PrintWriter out = new PrintWriter(new FileWriter("output.txt"));
for (int i = 0; i < SIZE; i++) {
out.println("Value at: " + i + " = " + list.get(i));
}
out.close();
}
} 8
Thursday, August 9, 12
Checked and unchecked
exceptions
✦ The constructor new FileWriter("output.txt") initializes an output stream to a file.
✦ If the file cannot be opened, the constructor throws an IOException.
✦ The call to the ArrayList’s get method list.get(i) may throw an
IndexOutOfBoundException if the value of its argument is invalid (negative
or larger than the size of the list).
✦ There are two possible exceptions, however, the compiler reports only the
error message thrown by the FileWriter constructor.
✦ The first exception is a checked exception.
✦ The second exception is an unchecked exception.
9
Thursday, August 9, 12
The try block
✦ Enclose the code that might throw an exception within a try block.
✦ In our example:
try {
// code
}
catch and finally blocks . . .
PrintWriter out = null;
try {
out = new PrintWriter(new FileWriter("output.txt"));
for (int i = 0; i < SIZE; i++) {
out.println("Value at: " + i + " = " + list.get(i));
}
} catch ...
10
Thursday, August 9, 12
The catch blocks
✦ Catch blocks are directly after the try block:
✦ Example:
try {
// code
} catch (ExceptionType e1) {
// code
} catch (ExceptionType e2) {
// code
}
try {
} catch (FileNotFoundException e) {
System.err.println("FileNotFoundException: " + e.getMessage());
throw new SampleException(e);
} catch (IOException e) {
System.err.println("Caught IOException: " + e.getMessage());
} 11
Thursday, August 9, 12
The catch blocks
✦ In Java SE 7 and later, a single catch block can handle multiple types of
exception.
catch (IOException | SQLException ex) {
logger.log(ex);
throw ex;
}
12
Thursday, August 9, 12
The finally block
✦ The finally block always executes when the try block exits.
✦ This ensures that the finally block is executed even if an unexpected
exception occurs.
✦ In the example, the program should close the stream before exiting the
writeList() method. The try block can exit in one of three ways:
✦ The new FileWriter statement fails and throws an IOException.
✦ The list.get(i) statement fails and throws an
ArrayIndexOutOfBoundsException.
✦ Everything succeeds and the try block exits normally.
13
Thursday, August 9, 12
The finally block
✦ The finally block is a perfect place to perform cleanup regardless of
what happens within the try block.
finally {
if (out != null) {
System.out.println("Closing PrintWriter");
out.close();
} else {
System.out.println("PrintWriter not open");
}
}
14
Thursday, August 9, 12
The complete example
public void writeList() {
PrintWriter out = null;
try {
System.out.println("Entering" + " try statement");
out = new PrintWriter(new FileWriter("output.txt"));
for (int i = 0; i < SIZE; i++)
out.println("Value at: " + i + " = " + list.get(i));
} catch (ArrayIndexOutOfBoundsException e) {
System.err.println("Caught ArrayIndexOutOfBoundsException: "
+ e.getMessage());
} catch (IOException e) {
System.err.println("Caught IOException: " + e.getMessage());
} finally {
if (out != null) {
System.out.println("Closing PrintWriter");
out.close();
} else {
System.out.println("PrintWriter not open");
}
}
} 15
Thursday, August 9, 12
Content
✦ What is an exception?
✦ Catching and handling exceptions
✦ Specifying the exceptions thrown by a method
✦ How to throw exceptions
✦ Advantages of exceptions
✦ Exercises
16
Thursday, August 9, 12
Specifying the exceptions thrown
by a method
✦ We have seen how exceptions can be handled by a method.
✦ Sometimes, it’s better to let a method further up the call stack handle
the exceptions.
✦ In this case, the method must specify that it can throw the exceptions
that could occur within its code.
✦ Recall that ArrayIndexOutOfBoundsException is an unchecked exception, so we
can just write the following:
public void writeList() throws IOException, ArrayIndexOutOfBoundsException {
public void writeList() throws IOException {
17
Thursday, August 9, 12
Content
✦ What is an exception?
✦ Catching and handling exceptions
✦ Specifying the exceptions thrown by a method
✦ How to throw exceptions
✦ Advantages of exceptions
✦ Exercises
18
Thursday, August 9, 12
How to throw exceptions
✦ Any code can throw an exception
by using the throw statement.
✦ The Java platform provides many
exception classes. All the classes are
descendants of the Throwable class.
✦ Syntax: throw someThrowableObject;
✦ Throwable objects are instances
of any subclass Throwable.
public Object pop() {
Object obj;
if (size == 0) {
throw new EmptyStackException();
}
obj = objectAt(size - 1);
setObjectAt(size - 1, null);
size--;
return obj;
}
19
Thursday, August 9, 12
Throwable class and its subclasses
Failures
of the JRE
Exception: IllegalAccessException, NegativeArraySizeException...
RuntimeException: NullPointerException, ArithmeticException...
20
Thursday, August 9, 12
Content
✦ What is an exception?
✦ Catching and handling exceptions
✦ Specifying the exceptions thrown by a method
✦ How to throw exceptions
✦ Advantages of exceptions
✦ Exercises
21
Thursday, August 9, 12
Advantages of exceptions
✦ Advantage 1: Separating error-handling code from regular code.
✦ Exceptions separate details of what to do when something out of
the ordinary happens from the main logic of a program.
✦ Consider the pseudocode method 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;
}
22
Thursday, August 9, 12
Advantages of exceptions
✦ Advantage 1: Separating error-handling code from regular code.
✦ Exceptions separate details of what to do when something out of
the ordinary happens from the main logic of a program.
✦ Consider the pseudocode method 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;
}
• What happens if the file can't be opened?
• What happens if the length of the file can't be
determined?
• What happens if enough memory can't be
allocated?
• What happens if the read fails?
• What happens if the file can't be closed?
22
Thursday, August 9, 12
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;
}
} else {
errorCode = -3;
}
close the file;
if (theFileDidntClose && errorCode == 0) {
errorCode = -4;
} else {
errorCode = errorCode and -4;
}
} else {
errorCode = -5;
}
return errorCode;
}
23
Thursday, August 9, 12
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;
}
} else {
errorCode = -3;
}
close the file;
if (theFileDidntClose && errorCode == 0) {
errorCode = -4;
} else {
errorCode = errorCode and -4;
}
} else {
errorCode = -5;
}
return errorCode;
}
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;
}
}
23
Thursday, August 9, 12
Advantages of exceptions
✦ Advantage 2: Propagating errors up the call stack.
✦ Suppose that the readFile() method is the fourth method in a series
of nested methods calls made by the main program.
method1 {
call method2;
}
method2 {
call method3;
}
method3 {
call readFile;
}
24
Thursday, August 9, 12
Advantages of exceptions
✦ Suppose that the method1 is the only method interested in the error
that might occur within readFile.
✦ Traditional error-notification techniques:
method1 {
errorCodeType error;
error = call method2;
if (error)
doErrorProcessing;
else
proceed;
}
errorCodeType method2 {
errorCodeType error;
error = call method3;
if (error)
return error;
else
proceed;
}
errorCodeType method3 {
errorCodeType error;
error = call readFile;
if (error)
return error;
else
proceed;
}
25
Thursday, August 9, 12
Advantages of exceptions
✦ In Java, only the methods that care about errors have to worry about
detecting errors.
method1 {
try {
call method2;
} catch (exception e) {
doErrorProcessing;
}
}
method2 throws exception {
call method3;
}
method3 throws exception {
call readFile;
}
26
Thursday, August 9, 12
Advantages of exceptions
✦ Advantage 3: Grouping and differentiating error types.
✦ The grouping and categorizing exceptions is a natural outcome of
the class hierarchy.
} catch (ArrayIndexOutOfBoundsException e) {
System.err.println("Caught ArrayIndexOutOfBoundsException: "
+ e.getMessage());
} catch (IOException e) {
System.err.println("Caught IOException: " + e.getMessage());
}
27
Thursday, August 9, 12
Content
✦ What is an exception?
✦ Catching and handling exceptions
✦ Specifying the exceptions thrown by a method
✦ How to throw exceptions
✦ Advantages of exceptions
✦ Exercises
28
Thursday, August 9, 12
Exercises
✦ Exercise 1. Write the program which was asked in the midterm test.
Note the use of exceptions in your code.
✦ Exercise 2. Is there anything wrong with the following exception
handler as written? Will this code compile?
try {
} catch (Exception e) {
} catch (ArithmeticException a) {
}
29
Thursday, August 9, 12