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

Java 정적 블록(Static Block)에서 예외를 발생시키는 방법 총정리

정적 블록(Static Block)이란?

정적 블록은 JVM이 main() 메서드를 실행하기 전에 수행하는 문장들의 집합입니다. 클래스가 로딩되는 시점에 특정 작업을 수행해야 한다면, 그 작업을 반드시 정적 블록 안에 정의해야 합니다. 정적 블록은 클래스 로딩 시점에 실행되기 때문입니다.

정적 블록에서 예외 발생시키기

  • 정적 블록에서는 RuntimeException(비검사 예외)만 던질 수 있으며, 검사 예외(checked exception)는 반드시 try-catch 블록으로 처리해야 합니다.
  • 정적 블록은 클래스 로더(class loader)가 클래스를 로드하는 시점에 실행됩니다. 초기화 코드는 정적 블록 형태로 작성하거나, 정적 데이터 멤버를 초기화하기 위한 정적 메서드 호출 형태로 작성할 수 있습니다.
  • 두 경우 모두 컴파일러는 검사 예외의 선언을 허용하지 않습니다. 비검사 예외(unchecked exception)가 발생하면 ExceptionInInitializerError로 감싸진 뒤, 클래스 로딩을 유발한 스레드의 컨텍스트에서 던져집니다.
  • 정적 블록에서 검사 예외를 직접 던지는 것 역시 불가능합니다. 정적 블록 내부에 try-catch 블록을 두어 try 블록에서 검사 예외가 발생할 수는 있지만, 반드시 catch 블록 안에서 처리를 마쳐야 하며 throw 키워드를 사용해 예외를 외부로 전파할 수 없습니다.

예제 코드

public class StaticBlockException {
    static int i, j;
    static {
        System.out.println("In the static block");
        try {
            i = 0;
            j = 10/i;
        } catch(Exception e){
            System.out.println("Exception while initializing" + e.getMessage());
            throw new RuntimeException(e.getMessage());
        }
    }
    public static void main(String args[]) {
        StaticBlockException sbe = new StaticBlockException();
        System.out.println("In the main() method");
        System.out.println("Value of i is : "+i);
        System.out.println("Value of j is : "+ j);
   }
}

실행 결과

In the static block
Exception while initializing/ by zero
Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.RuntimeException: / by zero
        at StaticBlockException.(StaticBlockException.java:10)

결과 분석

위 예제에서는 정적 블록 내에서 변수 i의 값이 0인 상태로 나누기 연산을 수행하여 ArithmeticException(0으로 나누기 오류)이 발생합니다. catch 블록이 이 예외를 잡아 메시지를 출력한 뒤 RuntimeException을 다시 던지고, JVM은 이를 ExceptionInInitializerError로 감싸 최종적으로 출력합니다. 이처럼 정적 블록에서 던져진 비검사 예외는 클래스 초기화 실패로 이어지며, main() 메서드는 실행되지 않고 프로그램이 종료됩니다.