코린이의 소소한 공부노트

멀티 catch 블록 본문

Java

멀티 catch 블록

무지맘 2022. 5. 24. 16:27

멀티 catch 블록은

1. 예외 타입은 다르지만 내용이 같은 catch 블록을 하나로 합친 것으로 (jdk 1.7부터 가능)

2. 코드의 중복 제거를 지원하는 기능이 있다.

3. OR 연산에 쓰이는 기호 |(shift + \)를 이용해 합칠 수 있다.

try{
    // ..
} catch(ExceptionA e){
    e.printStackTrace();
} catch(ExceptionB e){
    e.printStackTrace();
}

// 멀티 catch 블록으로 바꾸면
try{
    // ..
} catch(ExceptionA | ExceptionB e){
    e.printStackTrace();
}

4. 주의사항

 1) 멀티 catch 블록에 쓰일 예외 클래스에 부모-자식관계는 사용할 수 없다.

try{
    // ..
// } catch(ParentException | ChildException e){ // 에러
} catch(ParentException e){ // 위의 코드와 의미상으로는 동일함
    e.printStackTrace();
}

  -instanceof 연산자를 이용해서 맞는 catch 블록을 찾기 때문에, 굳이 부모-자식관계를 멀티 catch로 할 필요가 없다.

 2) 멀티 catch 블록에 선언된 참조변수는 해당 블록의 예외 클래스들의 공통 멤버만 접근 가능하다.

// ExceptionA에는 methodA()가 있고
// ExceptionB에는 methodB()가 있다.

try{
    // ..
    ExceptionB가 발생되는 코드
    // ..
} catch(ExceptionA | ExceptionB e){
    e.methodA(); // 에러
}

위 예시의 경우

  - 컴파일 단계: catch 블록에 ExceptionA가 있기 때문에 methodA()를 호출 가능하다고 판단 -> 통과

  - 실행 시: try문에서 ExceptionB가 발생하여 catch 블록으로 들어옴 -> methodA()를 호출할 수 없음 -> 에러

코드를 아래처럼 고치면 에러 없이 예외를 처리할 수 있다.

try{
    // ..
} catch(ExceptionA | ExceptionB e){
    if(e instanceof ExceptionA){
        ExceptionA e1 = (ExceptionA)e; // 형변환 필요
        e1.methodA();
    }
    else{ // if(e instanceof ExceptionB) 와 동일한 의미
        // ..
    }
}

사실, 이렇게 따로 처리할 거면 따로 catch 블록을 사용하면 된다. 하지만 멀티 catch 블록의 약점을 알아야 실수를 하지 않기 때문에 보여준 예시라고 생각해주면 좋겠다.

'Java' 카테고리의 다른 글

예외의 분류 - 컴파일러 기준  (0) 2022.05.25
예외 발생시키기  (0) 2022.05.25
예외 메시지 출력  (0) 2022.05.24
프로그램 오류의 종류와 예외 처리  (0) 2022.05.19
익명 클래스  (0) 2022.05.19