네, 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 크래시, 강제 프로세스 종료 등 극단적인 상황에서는 실행이 보장되지 않으므로, 이러한 제약 조건을 이해하고 사용하는 것이 중요합니다.