네, 자바(Java)에서는 하나의 try 블록에 여러 개의 catch 블록을 정의할 수 있습니다.
- 모든 try 블록은 반드시 최소 하나 이상의 catch 블록과 함께 사용되어야 합니다.
- try 블록 안에서 예외 객체가 발생했을 때 여러 개의 catch 블록이 존재한다면, 각 catch 블록이 정의된 순서에 따라 우선순위가 부여됩니다.
- 즉, 항상 첫 번째 catch 블록이 가장 높은 우선순위를 가지며, 해당 블록이 발생한 예외 객체를 처리할 수 없는 경우에만 바로 다음 catch 블록으로 검사가 넘어갑니다.
예제 코드
class TryWithMultipleCatch {
public static void main(String args[]) {
try{
int a[]=new int[5];
a[3]=10/0;
System.out.println("try 블록의 첫 번째 출력문");
} catch(ArithmeticException e) {
System.out.println("경고: ArithmeticException");
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println("경고: ArrayIndexOutOfBoundsException");
} catch(Exception e) {
System.out.println("경고: 기타 다른 예외");
}
System.out.println("try-catch 블록 종료");
}
}실행 결과
경고: ArithmeticException try-catch 블록 종료
동작 원리
위 코드에서 a[3]=10/0; 문장이 실행되는 순간 0으로 나누기를 시도하므로 ArithmeticException이 발생합니다. JVM은 try 블록 내에서 예외를 감지하면 위에서부터 차례대로 catch 블록을 검사하고, 가장 먼저 일치하는 첫 번째 catch 블록(ArithmeticException 처리부)에서 예외를 처리한 뒤 try-catch 구문 이후의 문장으로 실행 흐름을 이어갑니다.
주의 사항
여러 catch 블록을 작성할 때는 반드시 하위 예외 클래스(예: ArithmeticException, ArrayIndexOutOfBoundsException)를 상위 예외 클래스(예: Exception)보다 먼저 배치해야 합니다. 상위 타입인 Exception이 앞쪽에 선언되면 그 뒤에 있는 catch 블록들은 도달할 수 없어(unreachable catch block) 컴파일 오류가 발생하기 때문입니다.