카테고리 없음

자바 공부#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 리턴";
    }
}

 

실행결과는 다음과 같다.

.

.

.

더보기
더보기

catch 실행

finally실행

반환값: 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 블럭

반환값: finally 리턴

 

(finally의 return이 실행되며, 예외는 출력되지 않는다. (예외 무시됨))

 

catch->finally의 흐름

JVM은 catch 블록의 return "catch"를 만나면 바로 메서드를 종료하는 것이 아니라 

  1. "catch" 값을 임시 저장소(레지스터 or 스택)에 저장
  2. finally 블록 유무 확인
  3. finally 블록이 존재한다면, finally 블록 먼저 실행
  4. 만약 코드가 finally에서 끝나는 게 아니라면(예를 들어 finally에서 return으로 메서드를 끝내는 게 아니라면), finally 블록 실행이 끝난 후, 앞에서 저장해둔 "catch" 값을 return한다.

이렇게 try-catch-finally 구조에서는 finally의 실행을 무조건적으로 보장한다.

 

 

참고: 

- https://breakcoding.tistory.com/395

(위의 블로그에서 더 많은 예시를 볼 수 있다.)