자바 프로그램을 작성할 때 모든 예외에 대해 예외 처리를 작성하는 것은 아니다. 0으로 나눌 때 발생하는 ArithmeticException의 경우 처리를 강제하지 않는 것은 RuntimeException을 상속받은 예외인 언체크 예외이기 때문이고, 컴파일러가 Exception의 처리를 강제하는 것은 Exception이 체크 예외이기 때문이다.

Errors는 개발자가 처리할 수 없는 예외를 말한다. 대표적으로 재귀를 무한으로 실행할 때 발생하는 StackoverflowError나 JVM이 객체를 할당할 수 없을 때 발생하는 OOM같은 경우 개발자가 핸들링할 수 없다. Error는 개발자가 손 쓸 수 있는 코드가 아닌 프로그램 상 문제일 수 있기에 복구를 시도하지 않아야 한다. doc에서는 Throwable을 catch 하지 말라고 하는데, 상속 관계 상 Errors가 캐치될 수 있기 때문이다.
반면 Exception이란 개발자가 처리 가능한 예외를 말한다. 예외가 발생하게 될 경우 예외 인스턴스가 생성된다. 예외 인스턴스는 오류 발생 당시의 프로그램 상태(stacktrace)와 오류 정보(message)를 포함한다. 예외 인스턴스는 try catch 또는 예외 전가를 통해 처리할 수 있다.
ArithmeticException을 예로 들어 printstacktrace을 하는 경우 스택 상태와 함께 divide by zero이 출력된다. ArithmeticException이 발생하는 과정은 다음과 같다.
위를 보면 상속 관계에 따라 커스텀 Exception을 쉽게 작성할 수 있다. 사용자로부터 이름 입력값을 받아 검사한 뒤 발생시킬 커스텀 예외는 위 과정을 참고하여 다음처럼 작성한다.