Java

[Effective Java] 10-1. 예외

noahkim_ 2025. 1. 1. 02:38

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다.


1. 예외는 진짜 예외 상황에만 사용하라

  • 코드를 try-catch에 작성하면 jvm이 적용할 수 있는 최적화가 제한됨
  • 특정 상태에서만 호출할 수 있는 상태 의존적 메서드를 제공하는 클래스는 상태 검사 메서드도 함께 제공해야 함


2. 복구할 수 있는 상황에는 검사 예외를, 프로그래밍 오류에는 런타임 예외를 사용하라

검사 예외

  • 호출하는 쪽에서 복구하리라 여겨지는 상황
  • API 설계자는 검사 예외를 던져주어 사용자로 하여금 해당 상황에서 회복해달라 요구한 것

 

비검사 예외

런타임 예외
  • 프로그래밍 오류
  • 전제조건이 지켜지지 않을 경우가 대다수
  • 적절한 에러 메시지를 뱉으며 중단됨
  • RuntimeException 클래스

 

에러
  • 복구 불가능
  • jvm 단에서 나는 에러 (자원 부족, 불변식 깨짐)
  • Error 클래스

 

3. 필요 없는 검사 예외 사용은 피하라

  • 꼭 필요한 곳에만 사용한다면 검사 예외는 프로그램의 안정성을 높여주지만, 남용하면 고통스러움
  • API 호출자가 복구할 길이 없다면 비검사 예외를 포장해서 던지자
  • 복구가 가능하고 호출자가 그 처리를 해주길 바란다면 결과 타입을 담은 옵셔널을 반환하자

 

4. 표준 예외를 사용하라

이점

  • 다른 사람이 익히고 사용하기 쉬움

 

권고사항

Exception, RuntimeException, Throwable, Error는 직접 재사용 하지말자
  • 상위클래스이므로 안정적으로 테스트할 수 없음

 

직렬화 불가

 

대표 예외

IllegalArgumentException
  • 인수를 부적절한 값으로 넘길 경우 발생

 

IllegalStateException
  • 메서드를 실행하는데 적합하지 않을 때 발생

 

ConcurrentModificationException
  • 단일 스레드에서 사용하려고 설계한 객체를 여러 스레드가 동시에 수정하려 할 때 발생

 

UnsupportedOperationException
  • 클라이언트가 요청한 동작을 대상 객체가 지원하지 않을 때 발생

'Java' 카테고리의 다른 글

[Effective Java] 11-1. 동기화  (0) 2025.01.01
[Effective Java] 10-2. 예외  (0) 2025.01.01
[Effective Java] 9-1. 일반적인 프로그래밍 원칙  (0) 2025.01.01
[Effective Java] 8-2. 메서드  (0) 2024.12.31
[Effective Java] 8-1. 메서드  (2) 2024.12.31