Throwing an exception from within a finally block will mask any exception which was previously thrown in the try
or catch
block.
The masked's exception message and stack trace will be lost.
The following code:
try { /* some work which end up throwing an exception */ throw new IllegalArgumentException(); } finally { /* clean up */ throw new RuntimeException(); // Non-Compliant - will mask the IllegalArgumentException }
should be refactored into:
try { /* some work which end up throwing an exception */ throw new IllegalArgumentException(); } finally { /* clean up */ // Compliant }