I never properly understood the use of the finally statement. Can anyone tell me what the difference is between:
try { a; block; off; statements; } catch (Exception e) { handle; exception; e; } finally { do; some; cleanup; }
on the one hand and:
try { a; block; off; statements; } catch (Exception e) { handle; exception; e; } do; some; cleanup;
On the other
Advertisement
Answer
They differ if
- the
try
-block completes by throwing ajava.lang.Throwable
that is not ajava.lang.Exception
, for instance because it is ajava.lang.Error
such asAssertionError
orOutOfMemoryError
. - the try-block completes abruptly using a control flow statement such a
continue
,break
orreturn
- the catch-block completes abruptly (by throwing any throwable, or using a control flow statement)
More generally, the java language guarantees that a finally block is executed before the try-statement completes. (Note that if the try-statement does not complete, there is no guarantee about the finally. A statement might not complete for a variety of reasons, including hardware shutdown, OS shutdown, VM shutdown (for instance due to System.exit
), the thread waiting (Thread.suspend()
, synchronized
, Object.wait()
, Thread.sleep()
) or being otherwise busy (endless loops, ,,,).
So, a finally
block is a better place for clean-up actions than the end of the method body, but in itself, still can not guarantee cleanup exeuction.