Errors should not be caught or handled (except in the rarest of cases). Exceptions are the bread and butter of exception handling. The Javadoc explains it well:
An Error is a subclass of Throwable that indicates serious problems that a
reasonable application should not try to catch. Most such errors are abnormal
conditions.
Look at a few of the subclasses of Error
, taking some of their JavaDoc comments:
AnnotationFormatError
– Thrown when the annotation parser attempts to read an annotation from a class file and determines that the annotation is malformed.AssertionError
– Thrown to indicate that an assertion has failed.LinkageError
– Subclasses of LinkageError indicate that a class has some dependency on another class; however, the latter class has incompatibly changed after the compilation of the former class.VirtualMachineError
– Thrown to indicate that the Java Virtual Machine is broken or has run out of resources necessary for it to continue operating.
There are really three important subcategories of Throwable
:
Error
– Something severe enough has gone wrong the most applications should crash rather than try to handle the problem,- Unchecked Exception (aka
RuntimeException
) – Very often a programming error such as aNullPointerException
or an illegal argument. Applications can sometimes handle or recover from thisThrowable
category — or at least catch it at the Thread’srun()
method, log the complaint, and continue running. - Checked Exception (aka Everything else) – Applications are expected to be able to catch and meaningfully do something with the rest, such as
FileNotFoundException
andTimeoutException
…