복구할 수 있는 상황에는 검사 예외를, 프로그래밍 오류에는 런타임 예외를
호출하는 쪽에서 복구하리라 여겨지면 checkedException 을 던져서 구현자에게 회복을 요구할 수 있다. uncheckedException은 런타임/ 에러 가 있다. 프로그래밍 오류는 runtimeException을 사용하면 된다. 대부분은 전제조건을 만족하지 못했을 때 사용한다. 에러는 JVM이 자원부족, 불변식 깨짐 등 더 이상 수행을 계속할 수 없는 상황을 의미한다. 따라서 에러는 직접 구현할 일이 거의 없다. 대부분의 상황에서 개발자들은 uncheckedException으로 runtimeException을 서브클래싱할 가능성이 높다.
여기서 고민이 될거다. checkedException을 자주 사용하느게 좋은가? 검사 예외는 문제를 처리하게 해서 안정성을 높이게끔 해준다. 그런데 이 오류들이 쌓이면 피곤해진다. 다 처리해야하기 때문이다. 이를 회피하기 가장 쉬운 방법은 옵셔널을 반환하는 것이다. 차라리 빈 옵셔널을 반환하는게 좋다. 물론 이 방법도 왜 예외가 발생한지 모르기 때문에 구체적 예외 타입 등을 알 수 없다.
결론적으로 최대한 코드 내부에서 처리하되 옵셔널/ 에러 던지기를 잘 조절해서 던지는게 좋다.