자바 try-catch-finally 블록에서 finally 블록은 try 또는 catch 블록이 실행된 뒤 항상 실행됩니다.

몇가지 예외(ex. System.exit() 호출 등)를 제외하면 '무조건' 실행된다고 생각하시면 됩니다.

 

static int foo() {
    try {
        System.out.println("foo()");
        return 0;
    } catch (Exception e) {
        e.printStackTrace();
        return 1;
    } finally {
        System.out.println("finally");
    }
}

// 출력
// foo()
// finally

 

위 코드를 예로 들면, try 내부에서 foo()가 출력되고 0을 반환할텐데, 반환 전 finally 블록이 실행되고 반환됩니다.

C, C++에 익숙한 분이라면 return 구문을 만나자마자 반환되는게 아닌가 헷갈릴 수도 있는데, '자바 finally 블록은 무조건 실행되는구나' 생각하시면 될 것 같습니다.

 

finally 블록 내의 return

public class Main {
    public static void main(String[] args) {
        int a = foo();
        System.out.println(a);
    }

    static int foo() {
        try {
            System.out.println("foo()");
            return 0;
        } catch (Exception e) {
            e.printStackTrace();
            return 1;
        } finally {
            System.out.println("finally");
            return 2;
        }
    }
}

여기서 궁금한 점이, finally 블록 안에 return이 들어가 있으면 어떻게 될까요?

답은, 예외 catch 여부와 관계없이 finally 블록 내부에서 return 됩니다.

대부분은 의도하지 않은 결과일 겁니다. 이 부분을 주의하셔야 합니다.

 

IntelliJ에서 finally 블록 안에 return문이 있는 경우 오류가 표시되는 모습

'return' inside 'finally' block

IntelliJ같은 IDE는 친절하게 warning을 표시해주니 이 점 참고하시면 되겠습니다.

 

Reference

반응형