• The term exception is shorthand for the phrase "exceptional event."


  • Definition: An exception is an event, which occurs during the execution of a program, that disrupts the normal flow of the program's instructions.


  • When an error occurs within a method, the method creates an object and hands it off to the runtime system.


  • The object, called an exception object, contains information about the error, including its type and the state of the program when the error occurred.


  • Creating an exception object and handing it to the runtime system is called throwing an exception.


  • After a method throws an exception, the runtime system attempts to find something to handle it.


  • The set of possible "somethings" to handle the exception is the ordered list of methods that had been called to get to the method where the error occurred. The list of methods is known as the call stack.


  • The call stack showing three method calls, where the first method called has the exception handler.


  • call stack


  • The call stack. The runtime system searches the call stack for a method that contains a block of code that can handle the exception. This block of code is called an exception handler.


  • The search begins with the method in which the error occurred and proceeds through the call stack in the reverse order in which the methods were called.


  • When an appropriate handler is found, the runtime system passes the exception to the handler. An exception handler is considered appropriate if the type of the exception object thrown matches the type that can be handled by the handler.


  • The exception handler chosen is said to catch the exception. If the runtime system exhaustively searches all the methods on the call stack without finding an appropriate exception handler, as shown in the next figure, the runtime system (and, consequently, the program) terminates.


  • The call stack showing three method calls, where the first method called has the exception handler.


  • exceptions-errorOccurs


  • Searching the call stack for the exception handler. Using exceptions to manage errors has some advantages over traditional error-management techniques


  • Valid Java programming language code must honor the Catch or Specify Requirement. This means that code that might throw certain exceptions must be enclosed by either of the following:


    1. A try statement that catches the exception. The try must provide a handler for the exception.


    2. A method that specifies that it can throw the exception. The method must provide a throws clause that lists the exception.


  • Code that fails to honor the Catch or Specify Requirement will not compile.


  • Not all exceptions are subject to the Catch or Specify Requirement. To understand why, we need to look at the three basic categories of exceptions, only one of which is subject to the Requirement.


  • The Three Kinds of Exceptions The first kind of exception is the checked exception. These are exceptional conditions that a well-written application should anticipate and recover from.


  • For example, suppose an application prompts a user for an input file name, then opens the file by passing the name to the constructor for java.io.FileReader.


  • Normally, the user provides the name of an existing, readable file, so the construction of the FileReader object succeeds, and the execution of the application proceeds normally.


  • But sometimes the user supplies the name of a nonexistent file, and the constructor throws java.io.FileNotFoundException.


  • A well-written program will catch this exception and notify the user of the mistake, possibly prompting for a corrected file name.


  • Checked exceptions are subject to the Catch or Specify Requirement. All exceptions are checked exceptions, except for those indicated by Error, RuntimeException, and their subclasses.


  • The second kind of exception is the error. These are exceptional conditions that are external to the application, and that the application usually cannot anticipate or recover from.


  • For example, suppose that an application successfully opens a file for input, but is unable to read the file because of a hardware or system malfunction. The unsuccessful read will throw java.io.IOError.


  • An application might choose to catch this exception, in order to notify the user of the problem — but it also might make sense for the program to print a stack trace and exit.


  • Errors are not subject to the Catch or Specify Requirement. Errors are those exceptions indicated by Error and its subclasses.


  • The third kind of exception is the runtime exception. These are exceptional conditions that are internal to the application, and that the application usually cannot anticipate or recover from.


  • These usually indicate programming bugs, such as logic errors or improper use of an API. For example, consider the application described previously that passes a file name to the constructor for FileReader.


  • If a logic error causes a null to be passed to the constructor, the constructor will throw NullPointerException.


  • The application can catch this exception, but it probably makes more sense to eliminate the bug that caused the exception to occur.


  • Runtime exceptions are not subject to the Catch or Specify Requirement. Runtime exceptions are those indicated by RuntimeException and its subclasses.


  • Errors and runtime exceptions are collectively known as unchecked exceptions.


  • The first step in constructing an exception handler is to enclose the code that might throw an exception within a try block.


  • In general, a try block looks like the following:


  •  
    try {
        code
    }
    
    catch and finally blocks . . .
    
    
  • The segment in the example labeled code contains one or more legal lines of code that could throw an exception


  •  
    public class MyClass {
      public static void main(String[ ] args) {
        int[] myNumbers = {1, 2, 3};
        System.out.println(myNumbers[10]); // error!
      }
    }
    
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
            at MyClass.main(MyClass.java:4)
            
            
     public class MyClass {
      public static void main(String[ ] args) {
        try {
          int[] myNumbers = {1, 2, 3};
          System.out.println(myNumbers[10]);
        } catch (Exception e) {
          System.out.println("Something went wrong.");
        }
      }
    }
    
    Something went wrong.
    
    
    
  • Finally The finally statement lets you execute code, after try...catch, regardless of the result:


  •  
    public class MyClass {
      public static void main(String[] args) {
        try {
          int[] myNumbers = {1, 2, 3};
          System.out.println(myNumbers[10]);
        } catch (Exception e) {
          System.out.println("Something went wrong.");
        } finally {
          System.out.println("The 'try catch' is finished.");
        }
      }
    }
    
    Something went wrong.
    The 'try catch' is finished.
    
    
  • No code can be between the end of the try block and the beginning of the first catch block.


  •  
    try {
    
    } catch (ExceptionType name) {
    
    } catch (ExceptionType name) {
    
    }
    
    
  • Each catch block is an exception handler that handles the type of exception indicated by its argument.


  • The argument type, ExceptionType, declares the type of exception that the handler can handle and must be the name of a class that inherits from the Throwable class. The handler can refer to the exception with name.


  • The catch block contains code that is executed if and when the exception handler is invoked.


  • The runtime system invokes the exception handler when the handler is the first one in the call stack whose ExceptionType matches the type of the exception thrown.


  • The system considers it a match if the thrown object can legally be assigned to the exception handler's argument.


  • The following are two exception handlers for the writeList method:


  •  
    try {
    
    } catch (IndexOutOfBoundsException e) {
        System.err.println("IndexOutOfBoundsException: " + e.getMessage());
    } catch (IOException e) {
        System.err.println("Caught IOException: " + e.getMessage());
    }
    
    
  • In Java SE 7 and later, a single catch block can handle more than one type of exception. This feature can reduce code duplication and lessen the temptation to catch an overly broad exception.


  • In the catch clause, specify the types of exceptions that block can handle, and separate each exception type with a vertical bar (|):


  •  
    catch (IOException|SQLException ex) {
        logger.log(ex);
        throw ex;
    }
    
    
  • Note: If a catch block handles more than one exception type, then the catch parameter is implicitly final. In this example, the catch parameter ex is final and therefore you cannot assign any values to it within the catch block.