The possible exceptions in a Java program are organized in a hierarchy of classes,
rooted at class Throwable (§20.22), a direct subclass of Object. The
classes Exception and Error are direct subclasses of Throwable. The class
RuntimeException is a direct subclass of Exception.
The exception classes declared by the standard packages java.lang, java.util, java.io and java.net are called the standard exception classes.
Java programs can use the pre-existing exception classes in throw statements, or define additional exception classes, as subclasses of Throwable or of any of its subclasses, as appropriate. To take advantage of Java's compile-time checking for exception handlers, it is typical to define most new exception classes as checked exception classes, specifically as subclasses of Exception that are not subclasses of RuntimeException.