JAVA/Effective Java

[아이템 72] 표준 예외를 사용하라

꾸준함. 2024. 3. 25. 08:22

객체 지향 프로그래밍의 장점으로 `재사용성`이라는 특성은 항상 강조되며, 이는 예외도 마찬가지입니다.

  • 자바 라이브러리는 대부분 API에서 쓰기 충분한 수의 예외를 제공

 

표준 예외를 재사용해라

표준 예외는 많은 개발자들에게 이미 익숙하고 널리 사용되기 때문에 적용 시 다른 사람들이 API를 익히고 사용하기 쉽습니다.

또한, 예외 클래스 수가 적을수록 메모리 사용량도 줄고 클래스를 적재하는 시간도 적게 걸린다는 장점이 존재합니다.

달리 말하자면 무분별하게 Custom Exception을 생성하면 빌드하는 시간도 오래 걸리고 클래스 로딩 시간이 오래 걸린다는 뜻입니다.

그러나 대부분의 상용 서비스의 API 규격서에는 예외 상황이 발생하더라도 단순히 예외를 던지는 것이 아닌 API 응답을 반환하고, 이들은 대부분 별도의 예외 코드를 가지고 있기 때문에 커스텀 예외를 정의하는 것이 불가피합니다.

또한, 빌드 시간과 클래스 로딩 시간이 런타임에 영향을 끼치지 않으므로 문제가 없을 것으로 보입니다.

 

많이 사용되는 표준 예외

 

예외 주요 쓰임 및 설명
IllegalArgumentException 호출자가 인수로 부적절한 값을 넘길 때 던지는 예외

ex) 반복 횟수를 지정하는 매개변수에 음수를 건넬 경우
IllegalStateException 대상 객체의 상태가 호출된 메서드를 수행하기에 적합하지 않을 때 던지는 예외

ex) 초기화되지 않은 객체를 사용하려고 할 때
NullPointerException null을 허용하지 않는 메서드에 null을 건넸을 때 던지는 예외

ex) for-each문을 돌 때 list가 null
IndexOutOfBoundsException 인덱스가 범위를 넘어섰을 때 던지는 예외

ex) 크기가 3인 list가 있을 때 list.get(3)을 호출하는 경우
ConcurrentModificationException 싱글 쓰레드에서 사용하려고 설계한 객체를 다수의 쓰레드가 동시에 수정하려고 할 때 던지는 예외
동시 수정을 확실히 검출할 수 있는 안정된 방법은 없으나, 문제가 생길 가능성 정도만 알려주는 역할

ex) ArrayList를 for-each문으로 순회하는 도중 remove() 메서드 호출할 때
UnsupportedOperationException 클라이언트가 요청한 동작을 대상 객체가 지원하지 않을 때 던지는 예외
보통 구현하려는 인터페이스의 메서드 일부를 구현할 수 없는 경우에 사용

ex) 원소를 넣을 수만 있는 List 구현체에 대고 누군가 remove 메서드를 호출할 때
ArithmeticException
NumberFormatException
복소수나 유리수를 다루는 객체를 사용할 때 사용

ex) 숫자를 0으로 나눌 때 ArithmeticException 발생
ex) 숫자형 매개변수가 전달되어야 하는데 다른 형식의 데이터가 들어오는 경우 NumberFormatException 발생

 

이상이 확실히 가장 흔하게 재사용되는 예외이며 `주요 쓰임 및 설명`에 언급된 상황에 부합한다면 항상 표준 예외를 사용하는 것을 권장합니다.

예외에서 더 많은 정보를 제공하길 원할 경우 표준 예외를 확장해서 사용해도 좋지만 예외는 직혈화할 수 있고 직렬화에는 많은 부담이 따르기 때문에 꼭 필요한 경우에만 확장해서 사용하는 것을 권장합니다.

 

비고

 

IllegalStateException vs IllegalArgumentException

  • 인수 값이 무엇이었든 어차피 실패했을 것이라면 IllegalStateException을 던지자
  • 그렇지 않을 경우에는 IllegalArgumentException을 던지자

 

참고

이펙티브 자바

반응형