Since I am a new Java developer, I have also faced some difficulties for distinguishing and dealing with different types of exceptions. That is why I have made a short note on this topic, and whenever I get confused I go through it. Here it is with the image of the Throwable
class hierarchy:
[image courtesy of JavaTpoint].
There are three key classes to remember here: Throwable
, Exception
and Error
. Among these classes Exception
can be divided into two types: “Checked Exception” and “Unchecked Exception”.
Checked Exception:
- These are the classes that extend
Throwable
exceptRuntimeException
andError
. - They are also known as compile time exceptions because they are checked at compile time, meaning the compiler forces us to either handle them with
try/catch
or indicate in the function signature that itthrows
them and forcing us to deal with them in the caller. - They are programmatically recoverable problems which are caused by unexpected conditions outside the control of the code (e.g. database down, file I/O error, wrong input, etc).
- Example:
IOException
,SQLException
, etc.
Unchecked Exception:
- The classes that extend
RuntimeException
are known as unchecked exceptions. - Unchecked exceptions are not checked at compile-time, but rather at runtime, hence the name.
- They are also programmatically recoverable problems but unlike checked exception they are caused by faults in code flow or configuration.
- Example:
ArithmeticException
,NullPointerException
,ArrayIndexOutOfBoundsException
, etc. - Since they are programming errors, they can be avoided by nicely/wisely coding. For example “dividing by zero” produces an
ArithmeticException
, which can be avoided by a simple check on the divisor. Similarly we can avoidNullPointerException
by simply checking the references:if (object != null)
or even using better techniques.
Error:
Error
refers to an irrecoverable situation that is not being handled by atry/catch
.- Example:
OutOfMemoryError
,VirtualMachineError
,AssertionError
, etc.
Why are these many types?
In addition to Stephen C‘s answer I want to say:
exception handling is a relatively expensive operation in Java. We should not put all exceptional situation in a try/catch
block. Excessive use of try/catch
s may hamper program performance.
In conclusion, Exception
s should be handled programmatically whenever possible. On the other hand, we cannot handle Error
s, so these might be some logical reasons why there are many types of exceptions.