일상/레벨업 독서

[이펙티브 자바] Item 72 표준 예외를 사용하라.

Gamii 2022. 5. 30. 20:34
728x90
핵심 정리

더 많은 정보를 제공하고 싶은 경우에는 표준 예외를 확장해도 좋다. 하지만 예외는 직렬화할 수 있는데, 직렬화에는 많은 부담이 따르므로 예외를 새로 만들지 않는 것을 권장된다. (자바 라이브러리는 대부분 API에서 쓰기에 충분한 수의 예외를 제공한다.)

 

표준 예외를 재사용시 장점

1. 자신의 API가 다른 사람이 익히고 사용하기 쉬워진다. 많은 프로그래머에게 이미 익숙해진 규약을 그대로 따르기 때문이다.

2. 자신의 API를 사용한 프로그램도 낯선 예외를 사용하지 않게 되어 읽기 쉽다.

3. 예외 클래스 수가 적을수록 메모리 사용량도 줄고 클래스를 적재하는 시간도 적게 걸린다.

 

 

예외

예외 주요 쓰임 예시
IllegalArgumentException 허용하지 않는 값이 인수로 건네졌을 때(null은 따로 NullPointerException으로 처리) <select id="test" parameterType="String" resultType="String"> </select>

MyBatis 사용시 예외 발생시 원인
1. mapper id가 틀린 경우
2. parameter와 bean의 field명이 틀린 경우
3. namespace와 DAO에서 호출하는 namespace가 다를 경우
4. Spelling이 틀린 경우
5. mapper에 정의된 namespace 명칭이 같은 Application 내에 중복될 경우
IllegalStateException 객체가 메서드를 수행하기에 적절하지 않은 상태일 때  
NullPointerException null을 허용하지 않는 메서드에 null을 건넸을 때 String txt = null;
a.equals("Test");
IndexOutOfBoundsException 인덱스가 범위를 넘어섰을 때 List<String> str_list = new ArrayList<String>(Arrays.asList("a", "b", "c"));

str_list.get(3);
ConcurrentModificationException 단일 스레드에서 사용하려고 설계한 객체를 여러 스레드가 허용하지 않는 동시 수정이 발견됬을 때  
UnsupportedOperationException 호출한 메서드를 지원하지 않을 때  

 

Exception, RuntimeException, Throwable, Error는 직접 재사용하지 말자. 이 클래스들은 추상 클래스라고 생각하길 바란다. 이 예외들은 다른 예외들의 상위 클래스이므로, 즉 여러 성격의 예외들을 포괄하는 클래스이므로 안정적으로 테스트할 수 없다.

 

인수 값이 무엇이었든 어차피 실패했을 거라면 (객체의 현 상태로는 메서드 호출을 처리할 수 없다라는 뜻으로) IllegalStateException을, 그렇지 않으면 (인자의 값이 너무 컸다라는 뜻으로) IllegalArgumentException을 던지자.