We mentioned earlier that Java forces us to be explicit about our error handling, but it’s not necessary to require that every conceivable type of error be handled explicitly in every situation. Java exceptions are therefore divided into two categories: checked and unchecked. Most application-level exceptions are checked, which means that any method that throws one, either by generating it itself (as we’ll discuss later) or by ignoring one that occurs within it, must declare that it can throw that type of exception in a special throws clause in its method declaration. We haven’t yet talked in detail about declaring methods. For now, all you need to know is that methods have to declare the checked exceptions they can throw or allow to be thrown. If we had to throw multiple types of exceptions, we could declare them separated by commas:
void readFile( String s ) throws IOException, InterruptedException {
...
}
The throws clause tells the compiler that a method is a possible source of that type of
checked exception and that anyone calling that method must be prepared to deal with
it. The caller must then either use a try/catch block to handle it, or it must, in turn,
declare that it can throw the exception from itself.
In contrast, exceptions that are subclasses of either the class java.lang.RuntimeException or the class java.lang.Error are unchecked.
(Subclasses of Error are generally reserved for serious class loading
or runtime system problems.) It’s not a compile-time error to ignore the possibility of
these exceptions; methods also don’t have to declare they can throw them. In all other
respects, unchecked exceptions behave the same as other exceptions. We are free to
catch them if we wish, but in this case we aren’t required to.
Checked exceptions are intended to cover application-level problems, such as missing
files and unavailable hosts. As good programmers (and upstanding citizens), we should
design software to recover gracefully from these kinds of conditions. Unchecked exceptions
are intended for system-level problems, such as “out of memory” and “array
index out of bounds.” While these may indicate application-level programming errors,
they can occur almost anywhere and usually aren’t possible to recover from. Fortunately,
because they are unchecked exceptions, you don’t have to wrap every one of your arrayindex
operations in a try/catch statement (or declare all of the calling methods as a
potential source of them).
To sum up, checked exceptions are problems that a reasonable application should try
to handle gracefully; unchecked exceptions (runtime exceptions or errors) are problems
from which we would not normally expect our software to recover. Error types are those
explicitly intended to be conditions that we should not normally try to handle or recover
from.
0 comments:
Post a Comment