프로그래밍/Java
[Java] finally 블록
vince joe
2021. 12. 23. 22:33
자바 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 됩니다.
대부분은 의도하지 않은 결과일 겁니다. 이 부분을 주의하셔야 합니다.
'return' inside 'finally' block
IntelliJ같은 IDE는 친절하게 warning을 표시해주니 이 점 참고하시면 되겠습니다.
Reference
반응형