LALA's blog

Exception 본문

개발/자바

Exception

lala.seeun 2022. 4. 16. 19:47

Exception 상속 구조

예외는 진짜 예외 상황에만 사용해라

예외는 오직 예외 상황에서만 써야 한다. 절대로 일상적인 제어 흐름용으로 쓰여선 안 된다.

try {
    int i = 0;
    while (true) {
        range[i++].climb();
    }
} catch (ArrayIndexOutOfBoundsException e) {

}

코드를 try-catch 블록 안에 넣으면 JVM 이 적용할 수 있는 최적화가 제한된다. 예외를 사용한 경우 표준 관용구보다 훨씬 느리다.

 

또한 어떤 문제가 있을 수 있을까?

반복문 안에 버그가 숨어 있다면 흐름제어로 사용된 예외가 이 버그를 잡고 숨기게 되어 디버깅을 어렵게 만든다.

만약 climb() 내부 어딘가에서 관련없는 배열을 사용하다 ArrayIndexOutOfBoundsException 을 일으켰다면 해당 스레드는 예외를 잡지 않고 스택 예외 추적 정보를 남기며 종료되었을 것이다. 하지만 예외를 사용했기 때문에 해당 버그 때문인지 알지 못한 채 정상적인 반복문 종료 상황으로 넘어갈 것이다.

 

표준적이고 쉽게 이해되는 코드를 사용하고, 성능 개선을 목적으로 과하게 작성하는 기법은 자제해야 한다!

자바 플랫폼은 계속해서 개선되고 있기 때문에 최적화 노력은 그리 오래 가지 못할 것이고, 오히려 해당 코드에 숨겨진 버그를 찾는데 유지보수의 어려움을 갖게 될지 모른다!

 

  1. 상태 의존적 메서드를 제공하는 클래스는 상태 검사 메서드도 함게 제공해야 한다.
    • Iterator 인터페이스의 next 와 hasNext
  2. 올바르지 않은 상태일 때 빈 옵셔널 혹은 null 같은 특수한 값을 반환한다.

어떤 상황에서 선택하여 사용해야 할까?

  1. 외부 동기화 없이 여러 스레드가 동시에 접근하거나 외부 요인으로 상태가 변경될 수 있는 경우 빈 옵셔널 혹은 null 같은 특수한 값을 반환하는 것이 좋다.
    • 상태 검사 메서드는 상태 검증과 상태 의존 메서드 사이에 객체가 변경될 가능성이 있기 때문이다.
  2. 상태 검사 메서드가 상태 의존적 메서드와 중복되는 일을 수행한다면 빈 옵셔널 혹은 null 같은 특수한 값을 선택한다.
  3. 다른 모든 경우에는 상태 검사 메서드 방식이 조금 더 낫다고 할 수 있다.

Checked Exception 과  Unchecked Exception 차이

  Checked Exception Unchecked Exception
처리 여부 반드시 예외 처리 해야함 예외 처리 하지 않아도됨
대표 Exception IOException, SQLException NullPointerException, IllegalArgumentException

Checked Exception (검사 예외)

Checked Exception 은 Exception을 상속한다.

Checked Exception 또는 Compile Time Exception 이라고 한다.

checked Exception 을 던지면 호출부에서 try-catch 를 통해 예외를 잡아 처리하거나 더 바깥쪽으로 throws 를 통해 예외를 던져야 한다. 이 두 방법을 수행하지 않을 경우 컴파일 에러가 발생한다.

boolean execute() throws SQLException;

이 예외는 호출하는 쪽에서 복구하리라 여겨지는 상황에 사용하도록 해야한다. 즉, 해당 API 사용자에게 그 상황에서 회복해내라고 요구하는 것이다.

Unchecked Exception (비검사 예외)

Checked Exception 은 Runtime Exception 을 상속한다.

Uchecked Exception 는 복구하지 않아도 된다.

먼저 비검사 throwable 은 Runtime Exception 과 Error 가 있다. Error 는 JVM 자원 부족, 불변식 깨짐 등 더 이상 수행할 수 없는 상황일 때 사용된다.

이 둘은 잡을 필요가 없거나 통상적으로는 잡지 말아야 한다. 프로그래머가 Uchecked Exception 이나 Error 를 던졌다는 것은 회복이 불가능하거나 더 실행해봐야 득보단 실이 더 많다는 것이다.

 

복구할 수 있는 상황이면 Checked Exception 을 사용하자

프로그래밍 오류라면 Unchecked Exception 을 던지도록 하자!

명확하지 않다면, Unchecked Exception 을 던지도록 하자!

 

참조

  • 이펙티브 자바 3 [아이템 69] 예외는 진짜 예외 상황에만 사용하라
  • 이펙티브 자바 3 [아이템 70] 복구할 수 있는 상황에는 검사 예외를, 프로그래밍 오류에는 런타임 예외를 사용하라

'개발 > 자바' 카테고리의 다른 글

Collection 복사 방법 - 방어적 복사, unmodifiable, copyOf  (0) 2022.04.16
HashMap  (0) 2022.04.16
equals() 와 hashCode()  (0) 2022.04.16