예외처리를 생각하던 중 Try ~ catch문을 중첩해서 사용하는게 올바른 것이고? 중첩된 방식이 어떠한 구조로
작동하는지 헷갈려서 공부해봤습니다.
중첩된 try ~ ctach문
public static void main(String[] args) {
try {
System.out.println("main try - catch");
try {
System.out.println("second try - catch ");
try {
System.out.println(" third try - catch ");
}
} catch(Exception e2) {
// Exception
}
} catch(Exception e3) {
// Exception
}
}
위에 3개의 try catch문이 있습니다. main try catch문 아래에 second, second 아래에 third가 있네요.
쉽게 생각하기 위해 main의 자식이 second이고 second의 자식이 third라고 생각하겠습니다. 즉 third에게 main은 grand
parent 관계라고 할 수 있습니다.
그렇다면 third에서 일어난 예외처리를 어디서 진행할까요? 위 예제에서는 third의 try문에는 catch가 없습니다.
아래 예제를 통해 알아보겠습니다.
예제 1
public static void main(String[] args) {
try {
try {
try {
int[] arr = new int[10];
arr[11] = 5;
System.out.println(" third try - catch ");
} catch(ArithmeticException e3){
// ArithmeticException Exception
System.out.println("third catch exception");
}
} catch(ArrayIndexOutOfBoundsException e2) {
// ArrayIndexOutOfBoundsException
e2.printStackTrace();
System.out.println("second catch exception");
}
} catch(Exception e3) {
// Exception
System.out.println("main catch exception");
}
}
third try catch에서 일어난 ArrayIndexOutOfBoundsException을 exeception handling하지 못한다면 그 부모의 catch절
에서 에러를 핸들링하게 됩니다.
그래서 실행하게 되면 위와 같은 결과를 볼 수 있습니다.
예제 2
public static void main(String[] args) {
try {
try {
try {
int a = 5 / 0;
System.out.println(" third try - catch ");
} finally {
}
} catch(ArrayIndexOutOfBoundsException e2) {
// ArrayIndexOutOfBoundsException
e2.printStackTrace();
System.out.println("second catch exception");
}
} catch(Exception e) {
// Exception
e.printStackTrace();
System.out.println("main catch exception");
}
}
위와 같은 예제는 어디서 예외를 처리할까요?
third에서는 예외를 핸들링하는 catch문이 존재하지 않고, second는 ArithmeticException을 처리할 수 있는 catch문이 없
는걸 확인할 수 있습니다. 그러므로 마지막 main의 catch문에서 예외를 핸들링할 수 있습니다.
이게 기본적인 중첩 try catch문의 작동방식입니다.
저 역시 공부를 하면서 글을 작성하는 것이기 때문에 틀린점이 있을 수 있습니다!
댓글로 알려주시면 수정하도록 하겠습니다. 감사합니다!
'잡다한 개발잡담' 카테고리의 다른 글
Java - 배열, 리스트 내림차순으로 정렬하려면? (0) | 2020.08.20 |
---|---|
JAVA의 문자열 더하기 연산 비교 (0) | 2020.08.11 |
쿠키와 세션 (0) | 2020.06.28 |
Github Fork한 Repository 업데이트 하는 방법 (0) | 2020.06.28 |
스프링부트 - Unable to start embedded Tomcat 에러 해결하기 (0) | 2020.04.11 |