아이템 70. 복구할 수 있는 상황에는 검사 예외를, 프로그래밍 오류에는 런타임 예외를 사용하라 - KwangtaekJung/book-effective-java GitHub Wiki
- 호출하는 쪽에서 복구하리라 여겨지는 상황이라면 검사 예외를 사용하라.
- 검사 예외를 던지면 호출자가 그 예외를 try catch로 잡아서 처리하거나 더 바깥으로 전파하도록 강제하게 된다.
- 프로그래밍 오류라면 비검사 예외를 던지자.
- 비검사 예외나 Error은 프로그램에서 잡을 필요가 없거나 혹은 통상적으로는 잡지 말아야 한다.
- 프로그램에서 비검사 예외나 에러를 던졌다는 것은 복구가 불가능 하거나 더 실행해봐야 득보다는 실이 많은 경우이다.
=>던지는 것 자체는 가능하다??
- 확실하지 않다면 비검사 예외를 던지자.
- 검사 예외 라면 복구에 필요한 정보를 알려주는 메서드도 제공하자.

에러(Error)
- 위의 이미지에서도 볼 수 있듯 시스템에 비정상적인 상황이 생겼을 때 발생. 심각한 수준의 오류이고 어플리케이션에서 제어할 수 없기 때문에, 비검사예외(Unckecked Exception)로 분류. 어떤 흐름 중에 발생할 지 예측 불가.
예외(Exception)
- 예상할 수 있고 개발자의 로직에서 발생하므로, 개발자가 만들기도하고 처리도 가능.
검사 예외(Checked Exception)
- 컴파일 단계에 컴파일러가 체크, Exception 하위 클래스 중 Runtime 제외한 예외, 처리 안하면 컴파일 에러남. 예외 발생 시 트랜잭션 롤백하지 않음. 대표적으로 IOException, SQLException.
비검사 예외(Unchecked Exception)
- 실행 단계, 컴파일러에게 안걸러지고 실행했을 때 발생. 코드 상 문제. 예외 발생 시 트랜잭션 롤백함. 대표적으로 NullPointerException, OutOfBoundsException.
사용자 정의 예외
- 개발자가 생성하고 던지는 예외, 비정상적인, 예측가능한 예외에 대해 커스텀으로 생성한 예외를 던지고 처리하는 것.