Java/자바 정리

96. 예외 처리에도 순서가 있다! – Exception은 맨 마지막에 써야 해요

코딩하는냥이 2025. 5. 13. 11:45
반응형

이번 글에서는 예외 처리를 할 때 catch 블록의 순서가 왜 중요한지를 확인해봅니다.
특히, Exception처럼 상위 예외 클래스가 먼저 오면 어떤 문제가 발생하는지를 다루며,
실행 중 발생할 수 있는 두 가지 예외(ArrayIndexOutOfBoundsException, NumberFormatException)를
상위 타입인 Exception으로 하나로 묶어 처리하는 예제를 실습해봅니다.


📌 예제 코드

public class ExceptionHandlingExample {
    public static void main(String[] args) {
        String[] arrays = { "100", "1oo" }; // 두 번째 값은 숫자로 변환 불가

        for (int i = 0; i <= arrays.length; i++)  // 배열 범위를 초과하는 반복 조건
            try {
                int value = Integer.parseInt(arrays[i]); // 문자열을 정수로 변환
                System.out.println("array [" + i + "] : " + value);
            } catch (ArrayIndexOutOfBoundsException e) {
                System.out.println("배열 인덱스 초과 : " + e.getMessage());
            } catch (Exception e) { // NumberFormatException도 여기서 처리됨
                System.out.println("실행에 문제가 있습니다.");
            }
    }
}

💻 실행 결과

array [0] : 100
실행에 문제가 있습니다.
배열 인덱스 초과 : Index 2 out of bounds for length 2

💬 코드 설명

  • arrays[0]은 "100"이므로 정상적으로 출력됩니다.
  • arrays[1]은 "1oo"로, 알파벳 o가 섞여 있어 정수로 변환 불가
    → NumberFormatException 발생
    상위 예외인 Exception에서 처리
  • 반복문 조건이 i <= arrays.length이므로 i=2일 때 배열 인덱스 초과
    → ArrayIndexOutOfBoundsException 발생
    → 해당 예외 전용 catch에서 처리
  • Exception은 자바의 모든 예외의 상위 클래스이기 때문에, 그보다 구체적인 예외보다 반드시 아래에 위치해야 합니다.

⚠️ 만약 Exception이 위에 있다면?

try {
    // ...
} catch (Exception e) {
    // ...
} catch (ArrayIndexOutOfBoundsException e) {
    // ...
}

이 경우, ArrayIndexOutOfBoundsException이 발생해도 가장 먼저 매칭되는 상위 타입 Exception에서 처리되어
하위 타입인 ArrayIndexOutOfBoundsException 블록은 절대 실행되지 않습니다.

컴파일 에러 메시지:

Unreachable catch block for ArrayIndexOutOfBoundsException. It is already handled by the catch block for Exception.

즉, 상위 예외가 먼저 나오면 하위 예외는 절대 도달할 수 없는(dead code) 코드가 되므로, 자바 컴파일러가 오류를 발생시킵니다.


💡 포인트 정리

  • Exception은 모든 예외의 상위 타입이기 때문에, 항상 catch 블록의 가장 마지막에 작성해야 합니다.
  • 구체적인 예외를 먼저 작성하면 예외 상황을 정확히 구분해서 처리할 수 있습니다.
  • catch 순서를 잘못 작성하면 컴파일 자체가 되지 않으며, 예외별 처리가 불가능해질 수 있습니다.

📌 정리하자면, 예외 처리에서 catch 블록의 순서는 매우 중요하며, 상위 타입은 항상 마지막에 배치해야 합니다.
그렇지 않으면 구체적인 예외를 식별할 수 없고, 프로그램이 의도대로 동작하지 않거나 컴파일조차 되지 않을 수 있습니다.