JAVA

[JAVA] 예외 처리: 다중 catch문, 사용 시 주의할 점

정공자씨 2024. 4. 24. 17:08

 

다중 catch문

정의

  • 한 번에 여러 가지 예외를 처리하기 위해서 2개 이상의 catch블록을 사용할 수 있음
  • try 블록 다음에 2개 이상의 catch 블록을 사용함

 

다중 catch문 실행 순서

  • 실행 중에 예외가 발생하면, 다중 catch문은 순서대로 예외를 검사함
  • 하나의 try 블록에서 예외가 발생하면, 그 예외와 관련이 있는 catch 블록을 찾아서 실행함
  • 이때 상위의 예외 클래스 매개변수의 타입에 업캐스팅이 적용될 수 있음
[ 사용 시 주의할 점 ]
다중 catch문을 구현 할 때에, 상위의 예외 클래스 타입(Exception) catch문을 가장 뒤에 위치 시켜야 함


[ 이유 ]
하위 클래스 타입이 상위의 예외 클래스 타입(Exception)으로 업캐스팅이 가능하므로, 업캐스팅으로 인해서 모든 예외를 받을 수 있어서 다른 catch문이 불필요해짐

 

 

 

예외처리 순서 주의하기 : catch 블록의 순서 확인하기

1. Exception 클래스 타입 catch문을 가장 먼저 사용할 때

  • Exception 클래스는 모든 예외 클래스의 상위 클래스이고
  • ArrayIndecOutOfBoundsException와 ArithmeticException은 Exception 클래스의 하위 클래스
  • 상위의 클래스 타입(Exception)으로 발생한 예외를 모두 처리하기 때문에, 하위 예외 클래스가 실행될 일이 없음
    • 따라서, 상위의 예외 클래스일수록 하단에 위치해야 하고, 하위의 예외 클래스는 상단에 작성해야 함
[ 컴파일 오류 ]
상위 예외 클래스가 상단에 위치할 때 


만약 상위 예외 클래스가 상단에 위치하면, 하위 예외 클래스는 작동하지 않는 코드가 되기 때문에 컴파일 시에 Unreachable catch block for SQLException. It is already handled by the catch block for Exception 오류가 발생

 

2. 하위의 예외 클래스 타입 catch문을 가장 먼저 사용할 때

public class Test {
    public static void main(String[] args) {		
        int [] numbers = new int[2];

        try {
            numbers[0] = 0;
            numbers[1] = 1;
            numbers[2] = 2;  // ArrayIndexOutOfBoundsException 예외

            numbers[1] = 3/0; // ArithmeticException 예외
        } catch(ArrayIndexOutOfBoundsException arr) {
            System.out.println("배열의 범위를 벗어난 예외 처리");
        } catch(ArithmeticException arith) {
            System.out.println("값을 0으로 나누어 발생한 예외 처리");
        } catch(Exception e) {
            System.out.println("Exception");
        }
        System.out.println(Arrays.toString(numbers));  // [0,1]
    }
}

 

[ 실행 결과 ]

 

 

 


[ 정리 ]

  • try 블록 다음에 오는 catch 블록(예외 처리)은 1개 이상 올 수 있음(다중 catch)
  • 먼저 선언한 catch 블록의 예외 클래스가 가장 상위의 예외 클래스라면, 이후의 catch 블록은 실행될 일이 없으므로, 컴파일 되지 않음
  • 따라서, 마지막 catch 블록의 예외 클래스를 Exception 클래스로 지정해줘야 함
  • 하나의 try 블록에서 예외가 발생하면, 그 예외와 관련이 있는 catch 블록을 찾아서 실행함

 

 

 

 

 

 

출처

https://insight-bgh.tistory.com/24