자바 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
반응형
'프로그래밍 > Java' 카테고리의 다른 글
[Jitpack] 소개 및 사용법 (배포, 의존성 추가) (0) | 2022.06.01 |
---|---|
[Java8] 매개변수 3개 이상인 함수형 인터페이스 만드는 법 (0) | 2022.01.08 |
[Java] 오버로딩(Overloading) (0) | 2021.12.19 |
[Java] 배열(Array) (0) | 2021.12.18 |
[Java] Labeled statement (0) | 2021.12.18 |