실수로 finally 블록에 return을 넣었다가 값이 이상하게 나와서 한참을 봤네요. 재현해보니까 확실히 재밌는(?) 동작을 합니다.


public int test() {
    try {
        return 5;
    } finally {
        return 19;
    }
}


이거 돌리면 5가 아니라 19가 나옵니다. 심지어 try 안에서 예외를 던져도 finally의 return이 그걸 그냥 삼켜버려서 예외도 안 올라가더라고요.


try에서 분명 return 5를 했는데 이게 왜 그냥 사라지는 건가요? 자바 스펙상 원래 이런 게 맞는지, 그리고 이런 상황을 어떻게 피해야 하는지 궁금합니다.