Every exception in Java is an object that extends the Throwable class. Throwable has direct subclasses:
Error represents serious problems you should not try to recover from, like running out of memory.
Exception represents conditions your program can catch and handle.
Under Exception, there is one special subclass: RuntimeException. Exceptions that extend RuntimeException are called unchecked exceptions. All others under Exception are checked exceptions. This distinction controls whether the compiler forces you to handle them. I'll cover that difference in a later unit.