Notice
Recent Posts
Recent Comments
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

충분히 쌓여가는

멀티 catch 블럭 본문

Java/JAVA2

멀티 catch 블럭

빌드이너프 2023. 6. 22. 12:37

멀티 catch 블럭

내용이 같은 catch 블럭을 하나로 합친 것

try {
    ...
} catch (ExceptionA e) {
    e.printStackTrace();
} catch (ExceptionA e2) {
    e2.printStackTrace();
}


부모-자식 관계일 때는 에러 발생

catch 블럭 체크할 경우 instanceof로 체크한다

즉, 발생한 예외와 일치하는 것을 처리하는게 아닌 조상 타입의 참조변수가 선언되어 있는 catch 블럭으로 처리가능하다

(ChildException을 굳이 사용할 필요가 없다)

try {
    ...
    // } catch (ParentException | ChildException e) { // 에러
    } catch (ParentException e) { // OK, 위의 라인과 의미상 동일
        e.printStackTrace();
    }
}

 

 

참조변수로 사용할 수 있는 것은 공통된 블럭만 가능(아닌 경우 if else)

ExceptionA 혹은 ExceptionB가 발생하면 catch 블럭의 문장들이 실행됨

이때, ExceptionA에만 있는 특정 메서드를 호출하면 안된다

(멀티 catch 블럭에는 ExceptionA가 발생했을 때도 수행되고, ExceptionB가 발생했을 때도 수행되기 때문 => 둘 중에 어떤 객체가 만들어졌는지 모른다)

try {
    ...
} catch (ExceptionA | Exception B e) {
    e.methodA(); // 에러, ExceptionA에 선언된 methodA()는 호출불가
    
    // 굳이 ExceptionA에 있는 멤버를 사용하고 싶은 경우 if else 사용, 형변환
    if(e instanceof ExceptionA) {
        ExceptionA e1 = (ExceptionA)e; // 형변환
        e1.methodA(); // OK, ExceptionA에 선언된 메서드 호출가능
    } else { // if(e instanceof ExceptionB)
        ...
}

catch 블럭에 ExceptionA와 ExceptionB 중 어떤 것이 들어가는지 모른다

여기서 ExceptionA만 가지고 있는 methodA()만 호출하는 것은 에러가 발생한다

참조변수 e로는 빨간색으로 빗금친 공통된 멤버만 사용가능하다(하나의 catch 블럭으로 여러 예외를 처리하기 때문)

만약 굳이 ExceptionA에만 있는 다른 메서드를 사용하고 싶은 경우 if else 메서드로 형변환을 해줘야한다

 

 

'Java > JAVA2' 카테고리의 다른 글

checked 예외, unchecked 예외  (0) 2023.06.22
예외 발생시키기  (0) 2023.06.22
printStackTrace(), getMessage()  (0) 2023.06.22
예외 처리하기, try-catch문  (0) 2023.06.20
프로그램 오류, 예외 클래스의 계층구조  (0) 2023.06.19