The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available.
See Java Language Changes for a summary of updated language features in Java SE 9 and subsequent releases.
See JDK Release Notes for information about new features, enhancements, and removed or deprecated options for all JDK releases.
You associate exception handlers with a try
block by providing one or more catch
blocks directly after the try
block. 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()); }
Exception handlers can do more than just print error messages or halt the program. They can do error recovery, prompt the user to make a decision, or propagate the error up to a higher-level handler using chained exceptions, as described in the Chained Exceptions section.
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.