What happens if the finally block throws an exception?

The finally block executes regardless of whether an exception was thrown in its try block or not. If no exception occurs in try, but one occurs in finally, there's nothing particularly interesting: this exception will propagate up the call stack as usual until it encounters a matching catch.

The question typically refers to the second case, where execution enters finally while an exception is thrown from try. In this scenario, the exception from finally will replace the exception from try and will propagate up the stack instead. The original issue from try will simply be forgotten.

Such masking of exceptions makes debugging more difficult, and it’s best to avoid it. For example, IntelliJ IDEA provides a warning when a throw statement is used inside a finally block.

All the intricacies of exception flow through try-catch-finally are described in section 14.20.2 of the specification.