예외는 프로그램 실행 중 발생하는 오류로, 컴파일 시에 발견 가능한 컴파일 에러와는 다르다. 예외 발생 시 적절하게 처리하고 정상적으로 종료하기 위해 예외 처리를 한다.
예측이 불가능하고 강제로 프로그램을 종료시켜야 하는 런타임 에러와도 차이가 있다.
대표적인 예외 발생 사례는 정수를 0으로 나누는 경우, 인덱스 범위를 넘어가는 경우 등이 있다.
다음 예시는 정수를 0으로 나누는 경우의 예외 발생을 보여준다.

이 때 0을 입력받은 경우 다시 입력하도록 하거나 오류 메세지를 발생시키는 등 적당한 방식으로 처리할 수 있도록 예외 처리를 하기 위한 것이 try-catch-finally문이다.
try-catch-finally문의 구조는 다음과 같다.

catch 블록은 각 예외마다 하나씩 작성해야 한다. 다수의 예외가 발생할 수 있는 try 블록의 경우 여러 catch 블록을 작성할 수 있으며 그 중 발생한 예외와 일치하는 클래스를 인자로 전달받는 블록이 실행된다.
예외가 발생하지 않은 경우/발생한 경우 다음과 같은 실행 과정을 거친다.

예외 발생 여부에 상관 없이 실행되는 finally 블록은 생략 가능하다.
자주 사용되는 예외 클래스는 다음과 같다.

발생한 예외 타입과 일치하는 catch 블록이 없는 경우 프로그램은 강제 종료되며 catch 블록 내에서 System.exit(0)을 호출하면 프로그램이 종료된다.