Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java의 finally 블록은 항상 실행될까?

네, finally 블록은 대부분의 경우 항상 실행됩니다. 다만 JVM 크래시나 System.exit() 호출처럼 프로그램이 비정상적으로 종료되는 상황에서는 예외입니다.

finally 블록의 동작 원리

  • finally 블록은 예외가 발생하든 발생하지 않든 항상 실행됩니다.
  • 파일이나 데이터베이스 연결을 닫는 작업처럼 예외 발생 여부와 관계없이 반드시 수행해야 하는 정리(cleanup) 코드를 finally 블록에 작성합니다.
  • 다만 try 블록 안에 System.exit() 같은 코드가 있으면 프로그램이 즉시 종료되기 때문에 finally 블록은 실행되지 않습니다.

finally 블록이 실행되지 않는 경우

finally 블록은 다음과 같은 특수한 상황에서는 실행되지 않을 수 있습니다.

  • try 블록 내에서 System.exit() 호출로 JVM이 종료되는 경우
  • JVM이 메모리 부족(OutOfMemory)으로 비정상 종료되는 경우
  • 작업 관리자나 콘솔에서 자바 프로세스가 강제로 종료(kill)되는 경우
  • 정전 등으로 인해 시스템이 갑자기 종료되는 경우
  • try 블록 내부에 데드락(deadlock)이 발생하는 경우

예제 1: 일반적인 finally 블록 실행

public class FinallyBlock {
    public static void main(String args[]){
        try {
            int a=10,b=30;
            int c = b/a;
            System.out.println(c);
        } catch(ArithmeticException ae){
            System.out.println(ae);
        } finally {
            System.out.println("finally block is always executed");
        }
    }
}

위 예제에서 finally 블록은 예외 발생 여부와 관계없이 항상 실행됩니다.

실행 결과

3
finally block is always executed

예제 2: System.exit()로 인한 미실행

public class FinallyBlock {
    public static void main(String args[]) {
        try {
            System.out.println("I am in try block");
            System.exit(1);
        } catch(Exception ex){
            ex.printStackTrace();
        } finally {
            System.out.println("I am in finally block");
        }
    }
}

위 예제에서는 try 블록 안의 System.exit(1) 호출로 인해 프로그램이 즉시 종료되므로 finally 블록은 실행되지 않습니다.

실행 결과

I am in try block

정리

finally 블록은 리소스 해제, 연결 종료 등 필수 정리 작업을 보장하기 위한 핵심 도구입니다. 하지만 System.exit(), JVM 크래시, 강제 프로세스 종료 등 극단적인 상황에서는 실행이 보장되지 않으므로, 이러한 제약 조건을 이해하고 사용하는 것이 중요합니다.