13. Exceptions: When Things Go Wrong

13.3. Java’s Exception Hierarchy

The Java class library contains a number of predefined exceptions, some of which are shown in Figure 10.4. The most general type of exception, java.lang.Exception, is located in the java.lang package, but most of its subclasses are contained in other packages. Some of the various

 

Figure 10.4: Part of Java’s excep- tion hierarchy. All subclasses of RuntimeException are known as unchecked exceptions. Java pro- grams are not required to catch these exceptions.

 

 

 

 

 

 

IOException classes are contained in the java.io package, while oth-

ers are contained in the java.net package. In general, exception classesException hierarchy

are placed in the package that contains the methods that throw those exceptions.

Each of the classes in Figure 10.4 identifies a particular type of exception, and each is a subclass of the Exception class. Ob- viously a subclass defines a more specific exception than its su- perclass. Thus, both ArrayIndexOutOfBoundsException and StringIndexOutOfBoundsException are more specific than Index- OutOfBoundsException.

 

TABLE 10.1 Some of Java’s important exceptions.

ClassDescription

ArithmeticExceptionDivision by zero or some other kind of arithmetic problem

ArrayIndexOutOfBoundsExceptionAn array index is less than zero or greater

than or equal to the array’s length

FileNotFoundExceptionReference to a file that cannot be found IllegalArgumentExceptionCalling a method with an improper argument IndexOutOfBoundsExceptionAn array or string index is out of bounds NullPointerExceptionReference to an object that has not been instantiated NumberFormatExceptionUse of an illegal number format, such as when calling a method StringIndexOutOfBoundsExceptionA String index is less than zero or greater than

or equal to the String’s length

 

Table 10.1 gives a brief summary of some of the most important excep- tions. You’ve undoubtedly encountered some of these exceptions, because they are thrown by methods we have used repeatedly in programming examples. Table 10.2 summarizes the exceptions raised by some of the methods we’ve used most frequently.

 

TABLE 10.2 Some of Java’s important exceptions by method.

 

Class

Method

Exception Raised

Description

Double

valueOf(String)

NumberFormatException

The String is not a double

Integer

parseInt(String)

NumberFormatException

The String is not a int

String

String(String)

NullPointerException

The String is null

 

indexOf(String)

NullPointerException

The String is null

 

lastIndexOf(String)

NullPointerException

The String is null

 

charAt(int)

StringIndexOutOfBoundsException

The int is not a valid index

 

substring(int)

StringIndexOutOfBoundsException

The int is not a valid index

 

substring(int,int)

StringIndexOutOfBoundsException

An int is not a valid index

 

 

 

 

 

 

 

 

 

 

Checked exceptions

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Declaring an exception


SELF-STUDY EXERCISE

EXERCISE 10.1 What type of exception would be thrown for the fol- lowing statements?

Integer.parseInt("26.2");

String s; s.indexOf(’a’);

String s = "hello"; s.charAt(5);

Checked and Unchecked Exceptions

Java’s exception hierarchy is divided into two types of exceptions. A checked exception is one that can be analyzed by the Java compiler. Checked exceptions are thrown by methods such as the Buffered- Reader.readLine() method, in which there is a substantial likelihood that something might go wrong. When the compiler encounters one of these method calls, it checks whether the program either handles or declares the exception. Compile-time checking for these exceptions is designed to reduce the number of exceptions that are not properly han- dled within a program. This improves the security of Java programs.

 

 

The throws Clause

The IOException, which we encountered in Chapter 4 , is a checked exception. The Java compiler knows that readLine() is a method that can throw an IOException. A method that contains an expression that might throw a checked exception must either handle the exception or de- clare it. Otherwise, the compiler would generate a syntax error. The sim- plest way to avoid such a syntax error is to declare the exception, in our case that means qualifying the method header with the expression throws IOException.

In general, any method that contains an expression that might throw a checked expression must declare the exception. However, because one method can call another method, declaring exceptions can get a little tricky. If a method calls another method that contains an expression that

 

might throw an unchecked exception, then both methods must have a

throws clause. For example, consider the following program:

,,

 

 

 

 

 

 

 

 

 

 

J

In this case, the doRead() method contains a readLine() expres-

sion, which might throw an IOException. Therefore, the doRead() method must declare that it throws IOException. However, because doRead() is called by main(), the main() method must also declare the IOException.

 

 

 

 

The alternative approach would be to catch the IOException within the body of the method. We will discuss this approach in the next section.

 

 

Unchecked Exceptions

An unchecked exception is any exception belonging to a subclass of RuntimeException (Fig. 10.4). Unchecked exceptions are not checked by the compiler. The possibility that some statement or expression will lead to an ArithmeticException or NullPointerException is ex- tremely difficult to detect at compile time. The designers of Java decided that forcing programmers to declare such exceptions would not signifi- cantly improve the correctness of Java programs.

Therefore, unchecked exceptions do not have to be handled within

a program. And they do not have to be declared in a throws clause. Runtime (unchecked) exceptions

As shown in the chapter’s early divide-by-zero exception example, unchecked exceptions are handled by Java’s default exception handlers, unless your program takes specific steps to handle them directly. In many

 

cases leaving the handling of such exceptions up to Java may be the best course of action, as we will see Section 10.5.

 

The Exception Class

The java.lang.Exception class itself is very simple, consisting of just two constructor methods (Fig. 10.5). The Throwable class, from which Exception is derived, is the root class of Java’s exception and error hierarchy. It contains definitions for the getMessage() and printStackTrace() methods, which are two methods that we will use frequently in our error-handling routines.

SELF-STUDY EXERCISE

EXERCISE 10.2Which of the following are examples of unchecked

exceptions?

 

Figure 10.5: The java.lang.Ex- ception class.

 

 

 

 

 

 

 

 

 

Pulling the program’s fire alarm

 

 

 

 

 

Figure 10.6: Exception handling. When an exception occurs, an ob- ject will throw an Exception. The exception handler, possibly the same object, will catch it.


IOException

IndexOutOfBoundsException

NullPointerException

ClassNotFoundException

NumberFormatException