코딩 중 Try Catch 문에서 생각치 못한 것을 만났다. 바로 Finally와 return문의 우선순위 이다.
class TryCatchFinally
{
public static void main(String[] args) {
if(returnTest()){
System.out.println("returnTest is True");
} else {
System.out.println("returnTest is False");
}
}
static boolean returnTest() {
try{
return true;
}catch(Exception e){
return 0;
}finally{
return false;
}
}
}
위 코드를 실행하면 어떻게 될까? true? false? 아니면 0?
나는 항상 return문에 최우선 순위를 두고 코딩을 했었는데 finally도 예외는 아니었다. 단순히 IO 작업이나 소켓같은 close를 꼭 호출해야하는 코딩에서만 사용했기에 크게 깊이 생각하지도 않았다.
결론적으로 말하자면 위 코드는 returnTest is False를 출력한다. try catch문에 있어서는 모든 경우를 따지지 않고 return이 호출된 이후에도 fianlly가 제일 마지막으로 호출되며 종료된다. 이는 catch문 안에 있는 return도 예외가 아니다. try문 안에서 예외가 발생했더라도 fianlly에서 return을 호출하게 되면 정상 종료로 인식하게 되고 catch의 Exception 구문을 생략해 버린다.