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

Exception 계층 구조


ex.PNG

Errors는 개발자가 처리할 수 없는 예외를 말한다. 대표적으로 재귀를 무한으로 실행할 때 발생하는 StackoverflowError나 JVM이 객체를 할당할 수 없을 때 발생하는 OOM같은 경우 개발자가 핸들링할 수 없다. Error는 개발자가 손 쓸 수 있는 코드가 아닌 프로그램 상 문제일 수 있기에 복구를 시도하지 않아야 한다. doc에서는 Throwable을 catch 하지 말라고 하는데, 상속 관계 상 Errors가 캐치될 수 있기 때문이다.

반면 Exception이란 개발자가 처리 가능한 예외를 말한다. 예외가 발생하게 될 경우 예외 인스턴스가 생성된다. 예외 인스턴스는 오류 발생 당시의 프로그램 상태(stacktrace)와 오류 정보(message)를 포함한다. 예외 인스턴스는 try catch 또는 예외 전가를 통해 처리할 수 있다.

커스텀 Exception 작성


ArithmeticException을 예로 들어 printstacktrace을 하는 경우 스택 상태와 함께 divide by zero이 출력된다. ArithmeticException이 발생하는 과정은 다음과 같다.

  1. String 매개변수를 받는 ArithmeticException 생성자에 “divided by Zero” 전달하여 생성자 호출
  2. 부모인 RuntimeException의 생성자 호출
  3. 부모인 Throwable의 생성자 호출
  4. Throwable.detailMessage에 “divided by Zero” 설정

위를 보면 상속 관계에 따라 커스텀 Exception을 쉽게 작성할 수 있다. 사용자로부터 이름 입력값을 받아 검사한 뒤 발생시킬 커스텀 예외는 위 과정을 참고하여 다음처럼 작성한다.