Exception Hierarchies
The Throwable class is the super-class of all errors and exceptions in the Java language. Only objects that are instances of this class (or one of its sub-classes) are thrown by the Java Virtual Machine or can be thrown by the Java throw statement.
Exceptions are regular classes, and as such, one exception can sub-class another.
class BankingException extends Throwable {...}
class InsufficientFundsException extends BankingException {...}
class NegativeAmountException extends BankingException {...}

If an exception is declared to be caught, any of the sub-classes of that exception will also be caught by that same catch statement.
try {
// Some code that might throw BankingException exception
// or its sub-classes
} catch (BankingException e) {
// deal with the exception
}
When you chain catch
blocks, you must deal with more specific exceptions first.
try {
// Some code that might throw BankingException exception
// or its sub-classes
} catch (InsufficientFundsException e) {
// deal with InsufficientFundsException
} catch (BankingException e) {
// deal with the exception
}