It doesn't throw an exception because of the order in which the finally block is executed. The finally block is executed before the method returns. Since you return a value from finally, the method never gets to propagate that last exception.
Practically speaking, one should not return values or throw exceptions from a finally block.
subject: somebody pls explain why this code does not give an exception