조슈아 블로크 님의 "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 |