Try-Catch문이란?
- JAVA는 컴파일, 실행시 예외가 발생하면 에러로그와 함께 동작을 멈춥니다. 물론 혼자 공부할 때나 프로젝트를 실행하는 것이라면 문제가 안되지만. 현업에서 예외처리를 안했을 때 서버가 동작을 멈춰버리면 기업입장에서 엄청난 손해를 보게 될 것입니다. 이런 이유로 예외처리라는 것이 존재하며, 그 중 하나의 방법인 Try-Catch문의 간단한 예제와 설명을 적어두려 합니다.
Try-Catch문의 기본 구조
try{
실행문
}catch(발생되는 exception e){
예외처리
}finally{
마지막에 무조건 실행할 구문
}
위의 구조를 살펴보시면 try에는 실행할 구문을 입력하고, catch에서는 try문에서 나올 것으로 예측되는 예외를 처리합니다. finally에 들어가는 구문은 예외가 발생되어도 실행됩니다. 이제부터 예제를 살펴보겠습니다.
우선 정수가아닌 문자를 숫자로 바꿀 때 일어나는 NumberFormatException을 임의로 발생시키고, try-catch문이 없으면 어떻게되는지 살펴보겠습니다.
public class TryCatch {
public static void main(String[] args) {
String a = "1가"; // 문자 선언
int num = Integer.parseInt(a);
System.out.println("변환 완료");
}
}
이 코드를 실행시키면 다음과 같은 결과가 나옵니다.
예상했던대로 예외가 발생했습니다. 또한 맨 밑의 변환 완료는 실행되지 않고 프로그램이 종료되었습니다.
여기서 try-catch문을 적용해보겠습니다.
public class TryCatch {
public static void main(String[] args) {
String a = "1가"; // 문자 선언
try {
int num = Integer.parseInt(a);
}catch (NumberFormatException e){
System.out.println("숫자변환에러");
}finally {
System.out.println("예외가 발생되어도 실행");
}
System.out.println("변환 완료");
}
}
해당 코드는 "1가"를 숫자로 변환하는 것을 시도할 것이며, NumberFormatException이 발생되면 "숫자변환에러"를 출력하고, 마지막엔 무조건 "예외가 발생되어도 실행"을 찍어낼 것입니다. 또한 예외처리를 한 후 다음 로직도 실행하기때문에 "변환 완료" 라는 문장도 이상없이 출력될 다음은 실행 결과입니다.
예상한 대로 모두 실행 되었습니다. 그러나 항상 모든 구문에서 발생되는 예외를 알 수는 없습니다. 그럴 땐 Exception객체를 사용하면 됩니다.
public class TryCatch {
public static void main(String[] args) {
String a = "1가"; // 문자 선언
try {
int num = Integer.parseInt(a);
}catch (Exception e){ // 모든 예외를 잡아내도록 변경
System.out.println("숫자변환에러");
}finally {
System.out.println("예외가 발생되어도 실행");
}
System.out.println("변환 완료");
}
}
결과는 처음 실행한 것과 같습니다.
그러나 무조건 Exception으로 잡는 것은 좋지 않습니다. 보통 예외가 발생하면 해당 기능은 작동이 불가능 한 것이므로, 로그를 남기는게 대부분인데 그럴 경우 exception으로만 잡으면 무슨 예외가 발생했는지 알기 어렵습니다. 따라서 다음과 같이 처리합니다.
public class TryCatch {
public static void main(String[] args) {
String a = "1가"; // 문자 선언
try {
int num = Integer.parseInt(a);
}catch (NumberFormatException e){ // 의심가는 예외 먼저 처리
System.out.println("숫자 변환 에러");
} catch (Exception e){ // 그 외의 예외발생시 처리
System.out.println("에러");
}finally {
System.out.println("예외가 발생되어도 실행");
}
System.out.println("변환 완료");
}
}
System.out.println이 로그를 남기는 구문이라고 치고, 이렇게 되면 NumberFormatException은 로그에 "숫자 변환 에러"라고 남을 것이고, 다른 예외가 발생하면 로그에 "에러" 가 남을 것입니다. 코드에 따라 더 세분화하면 디버깅을 더 쉽게 하실수 있겠죠?
마지막으로 주의점 하나가 있습니다. NumberFormatException과 같은 세부적인 예외에 대한 catch문은 항상 Exception위에 놓아야합니다. 잘못된 예시 코드입니다.
public class TryCatch {
public static void main(String[] args) {
String a = "1가"; // 문자 선언
try {
int num = Integer.parseInt(a);
} catch (Exception e){ // 모든 예외를 처리함
System.out.println("에러");
} catch (NumberFormatException e){ // 절대 catch되지않음
System.out.println("숫자 변환 에러");
}finally {
System.out.println("예외가 발생되어도 실행");
}
System.out.println("변환 완료");
}
}
Exception은 모든 예외의 부모클래스이기 때문에, NumberFormatException역시 잡아냅니다. 때문에 아래의 NumberFormatException은 절대로 catch문이 실행되지않습니다. IDE에서도 바로 에러가 발생하는데요.
때문에 항상 Exception은 코딩시 마지막에 넣어주어야합니다. 이상으로 try-catch문에 대한 포스팅을 마치겠습니다.
긴 글 읽어주셔서 감사합니다.
'JAVA' 카테고리의 다른 글
[Spring] Spring boot 프로젝트 생성 방법 (0) | 2023.07.14 |
---|---|
[JAVA] NetworkOnMainThreadException 해결 (0) | 2023.07.12 |
[JAVA] 익명 클래스에 대하여 (0) | 2023.07.10 |
[JAVA] 지역 변수와 전역 변수 (0) | 2023.07.07 |
[JAVA, JS]프로그램 변수란? (0) | 2023.07.05 |