Throwable
is a class for all the bad situations, which can arise: Errors & Exceptions.
Error
is something, you can't handle at all: OutOfMemoryError
, VirtualMachineError
, etc.
Exception
is for exceptional cases.
Exceptions come in 2 flavours:
RuntimeException
s.
These ones, you are not aware of: NullPointerException
, ClassCastException
, etc.
Checked
exceptions.
These are the exceptions, which your code is aware of and should be explicitely catched (... throws MyException
): IOException
s, etc.
If you want the users of your code, to explicitely handle some exceptional situations, it would be good to just extend Exception
, not the RuntimeException
. There's no need to extend Throwable
.