카테고리 없음
자바 공부#4_01. 예외처리 기본
코딩연습중
2025. 4. 10. 14:35
1. try-catch-finally 구조
예외 처리는 프로그램 실행 중 발생할 수 있는 예외 상황을 적절히 처리하여 프로그램이 비정상적으로 종료되지 않도록 하기 위해 사용된다.
자바에서는 try-catch-finally 구조를 통해 예외 상황을 제어할 수 있다.
try {
// 예외 발생 가능성이 있는 코드
} catch (Exception e) {
// 예외 발생 시 처리할 코드
} finally {
// 무조건 실행되는 코드 (자원 정리 등)
}
- try: 예외가 발생할 수 있는 코드 블록
- catch: 예외가 발생했을 때 실행할 블록
- finally: 예외 발생 여부와 관계없이 항상 실행되는 블록
(ex. 파일 닫기, DB 연결 종료 등 리소스 정리 용도)
필요한 경우 catch를 여러 개 사용할 수 있으며, 예외 종류에 따라 구체적으로 분기 처리가 가능하다.
여기까지는 예외 처리의 기본 설명이었다. 그럼 다음 코드의 실행결과는 어떻게 될까?
public String test() {
try {
throw new Exception("에러 발생");
} catch (Exception e) {
System.out.println("catch 실행");
return "catch 리턴";
} finally {
System.out.println("finally 실행");
return "finally 리턴";
}
}
실행결과는 다음과 같다.
.
.
.
두번째 예시
public class Test {
public static void main(String[] args) {
try {
throw new RuntimeException("예외 발생!");
} catch (Exception e) {
System.out.println("catch 블럭");
throw e;
} finally {
System.out.println("finally 블럭");
return "finally 리턴";
}
}
}
위의 결과는 어떻게 될까?
.
.
.
catch->finally의 흐름
JVM은 catch 블록의 return "catch"를 만나면 바로 메서드를 종료하는 것이 아니라
- "catch" 값을 임시 저장소(레지스터 or 스택)에 저장
- finally 블록 유무 확인
- finally 블록이 존재한다면, finally 블록 먼저 실행
- 만약 코드가 finally에서 끝나는 게 아니라면(예를 들어 finally에서 return으로 메서드를 끝내는 게 아니라면), finally 블록 실행이 끝난 후, 앞에서 저장해둔 "catch" 값을 return한다.
이렇게 try-catch-finally 구조에서는 finally의 실행을 무조건적으로 보장한다.
참고:
- https://breakcoding.tistory.com/395
(위의 블로그에서 더 많은 예시를 볼 수 있다.)