The term exception is shorthand for the phrase
"exceptional event."
Definition:
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 error occurs within a method, the method
creates an object and hands it off to the runtime system. The object, called an
exception object, contains information about the error, including its type and
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.
After a method throws an exception, the runtime
system attempts to find something to handle it. The set of possible
"somethings" to handle the exception is the ordered list of methods
that had been called to get to the method where the error occurred. The list of
methods is known as the call stack (see the next figure).
The call stack showing three method calls, where the
first method called has the exception handler.
The runtime system searches the call stack for a
method that contains a block of code that can handle the exception. This block
of code is called an exception handler. The search begins with the method in
which the error occurred and proceeds through the call stack in the reverse
order in which the methods were called. 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, as shown in the
next figure, the runtime system (and, consequently, the program) terminates.
The call stack showing three method calls, where the
first method called has the exception handler.
Searching the call stack for the exception handler.
Using exceptions to manage errors has some
advantages over traditional error-management techniques. You can learn more in
the Advantages of Exceptions section.
The first step in constructing an exception handler
is to enclose the code that might throw an exception within a try block. In
general, a try block looks like the following:
try {
code
}
catch
and finally blocks . . .
The segment in the example labeled code contains one
or more legal lines of code that could throw an exception. (The catch and
finally blocks are explained in the next two subsections.)
To construct an exception handler for the writeList
method from the ListOfNumbers class, enclose the exception-throwing statements
of the writeList method within a try block. There is more than one way to do
this. You can put each line of code that might throw an exception within its
own try block and provide separate exception handlers for each. Or, you can put
all the writeList code within a single try block and associate multiple
handlers with it. The following listing uses one try block for the entire
method because the code in question is very short.
private List<Integer> list;
private static final int SIZE = 10;
PrintWriter out = null;
try {
System.out.println("Entered try statement");
out = new
PrintWriter(new FileWriter("OutFile.txt"));
for (int i
= 0; i < SIZE; i++) {
out.println("Value at: " + i + " = " + list.get(i));
}
}
catch and finally statements . . .
If an exception occurs within the try block, that
exception is handled by an exception handler associated with it. To associate
an exception handler with a try block, you must put a catch block after it; the
next section, The catch Blocks, shows you how.
The
catch Blocks
You associate exception handlers with a try block by
providing one or more catch blocks directly after the try block. No code can be
between the end of the try block and the beginning of the first catch block.
try {
} catch (ExceptionType name) {
} catch (ExceptionType name) {
}
Each catch block is an exception handler and handles
the type of exception indicated by its argument. The argument type,
ExceptionType, declares the type of exception that the handler can handle and
must be the name of a class that inherits from the Throwable class. The handler
can refer to the exception with name.
The catch block contains code that is executed if
and when the exception handler is invoked. The runtime system invokes the
exception handler when the handler is the first one in the call stack whose
ExceptionType matches the type of the exception thrown. The system considers it
a match if the thrown object can legally be assigned to the exception handler's
argument.
The following are two exception handlers for the
writeList method — one for two types of checked exceptions that can be thrown
within the try statement:
try {
} catch (FileNotFoundException e) {
System.err.println("FileNotFoundException: " +
e.getMessage());
throw new
SampleException(e);
} catch (IOException e) {
System.err.println("Caught IOException: " + e.getMessage());
}
Both handlers print an error message. The second
handler does nothing else. By catching any IOException that's not caught by the
first handler, it allows the program to continue executing.
The first handler, in addition to printing a
message, throws a user-defined exception. (Throwing exceptions is covered in
detail later in this chapter in the How to Throw Exceptions section.)
In this example, when the FileNotFoundException is
caught it causes a user-defined exception called SampleException to be thrown.
You might want to do this if you want your program to handle an exception in
this situation in a specific way.
Exception handlers can do more than just print error
messages or halt the program. They can do error recovery, prompt the user to
make a decision, or propagate the error up to a higher-level handler using
chained exceptions, as described in the Chained Exceptions section.
Catching More Than One Type of Exception with One
Exception Handler
In Java SE 7 and later, a single catch block can
handle more than one type of exception. This feature can reduce code
duplication and lessen the temptation to catch an overly broad exception.
In the catch clause, specify the types of exceptions
that block can handle, and separate each exception type with a vertical bar
(|):
catch (IOException|SQLException ex) {
logger.log(ex);
throw ex;
}
Note: If a catch block handles more than one
exception type, then the catch parameter is implicitly final. In this example,
the catch parameter ex is final and therefore you cannot assign any values to
it within the catch block.
No comments:
Post a Comment