Exception handling can be viewed as a nonlocal control structure.
When a method throws an exception, its caller must determine whether it can catch the exception.
If the calling method can catch the exception, it takes over and execution continues in the caller.
Java exceptions are class objects subclassed from java.lang.Throwable. Because exceptions are class objects, they can contain both data and methods. In fact, the base class Throwable implements a method that returns a String describing the error that caused the exception. This is useful for debugging and if we want to give users a meaningful error message.