In Java, a try { … } finally { … } is executed somewhat unintuitively to me. As illustrated in another question, Does finally always execute in Java?, if you have a return statement in the try block, it will be ignored if a finally block is defined. For example, the function
boolean test () {
try {
return true;
}
finally {
return false;
}
}
will always return false. My question: why is this? Is there a particular philosophy behind this design decision made by Java? I appreciate any insight, thank you.
Edit: I’m particularly interested as to ‘why’ Java thinks it’s ok to violate the semantics that I define. If I ‘return’ in a try block, the method should return right then and there. But the JVM decides to ignore my instruction and return from a subroutine that actually hasn’t yet been reached.
Technically speaking, the
returnin the try block won’t be ignored if afinallyblock is defined, only if that finally block also includes areturn.It’s a dubious design decision that was probably a mistake in retrospect (much like references being nullable/mutable by default, and, according to some, checked exceptions). In many ways this behaviour is exactly consistent with the colloquial understanding of what
finallymeans – “no matter what happens beforehand in thetryblock, always run this code.” Hence if youreturn truefrom afinallyblock, the overall effect must always to be to return true, no?In general, this is seldom a good idiom, and you should use
finallyblocks liberally for cleaning up/closing resources but rarely if ever return a value from them.