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