Because section 14.20.2 of the JLS says so (third edition):
If execution of the try block completes abruptly for any other reason R, then the finally block is executed. Then there is a choice:
If the finally block completes normally, then the try statement completes abruptly for reason R.
If the finally block completes abruptly for reason S, then the try statement completes abruptly for reason S (and reason R is discarded).
According to section 14.1 (and 14.17) a return statement always completes abruptly.
Still, if you compile the first code sample with the Sun compiler and specify the -Xlint option (or -Xlint:finally)
you should get a compiler warning something like: "warning: [finally] finally clause cannot complete normally". If anything that should be enough of an indication that the return-from-finally approach is rarely, if ever, appropiate.
Also, it might be worth noting that by returning from within a finally block you can inadvertantly discard unhandled exceptions thrown from within the try block.
[ December 30, 2008: Message edited by: Jelle Klap ]