Exceptions: When Things Go Wrong
10.4 Handling Exceptions Within a Program Exception Propagation: Searching for a Catch Block
Syntax and Semantics of Try/Throw/Catch
A try block begins with the keyword try followed by a block of code
enclosed within curly braces. A catch clause or catch block consists of the
keyword catch, followed by a parameter declaration that identifies the
type of Exception being caught, followed by a collection of statements
The catch block enclosed within curly braces. These are the statements that handle the
exception by taking appropriate action.
Once an exception is thrown, control is transferred out of the try block
to an appropriate catch block. Control does not return to the try block.
The complete syntax of the try/catch statement is summarized in Figure 10.9. The try block is meant to include a statement or statements that
might throw an exception. The catch blocks—there can be one or more—
are meant to handle exceptions that are thrown in the try block. A catch
block will handle any exception that matches its parameter class, including subclasses of that class. The finally block clause is an optional clause
that is always executed, whether an exception is thrown or not.
The statements in the try block are part of the program’s normal flow
of execution. By encapsulating a group of statements within a try block, you thereby indicate that one or more exceptions may be thrown by those
statements, and that you intend to catch them. In effect, you are trying a
block of code with the possibility that something might go wrong.
If an exception is thrown within a try block, Java exits the block and
transfers control to the first catch block that matches the particular kind of exception that was thrown. Exceptions are thrown by using the throw
statement, which takes the following general form:
The keyword throw is followed by the instantiation of an object of the
ExceptionClassName class. This is done the same way we instantiate any object in Java: by using the new operator and invoking one of
the exception’s constructor methods. Some of the constructors take an
OptionalMessageString, which is the message that gets returned by
the exception’s getMessage() method.
A catch block has the following general form:
A catch block is very much like a method definition. It contains a parameter, which specifies the class of exception that is handled by that block.
The ParameterName can be any valid identifier, but it is customary to use
e as the catch block parameter. The parameter’s scope is limited to the
catch block, and it is used to refer to the caught exception.
The ExceptionClassName must be one of the classes in Java’s exception hierarchy (see Fig. 10.4). A thrown exception will match any parameter of
its own class or any of its superclasses. Thus, if an ArithmeticException is thrown, it will match both an ArithmeticException parameter and an Exception parameter, because ArithmeticException is a
subclass of Exception.
Note that there can be multiple catch clauses associated with a given
try block, and the order with which they are arranged is important. A
thrown exception will be caught by the first catch clause it matches.
Therefore, catch clauses should be arranged in order from most specific to most general (See the exception hierarchy in Figure 10.4). If a more
general catch clause precedes a more specific one, it will prevent the more
specific one from executing. In effect, the more specific clause will be hidden by the more general one. You might as well just not have the more
specific clause at all.
To illustrate how to arrange catch clauses, suppose an ArithmeticException is thrown in the following try/catch statement:
In this case, the exception would be handled by the more specific
ArithmeticException block. On the other hand, if some other kind of exception is raised, it will be caught by the second catch clause. The
Exception class will match any exception that is thrown. Therefore, it
should always occur last in a sequence of catch clauses.