Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does a finally block run even if you throw a new Exception?

In this code will someVar be set even if the catch block is executed and the second Exception is thrown?

public void someFunction() throws Exception {
    try {
        //CODE HERE
    } catch (Exception e) {
        Log.e(TAG, "", e);
        throw new Exception(e);
    } finally {
        this.someVar= true;
    }
}
like image 647
jax Avatar asked Sep 29 '22 05:09

jax


People also ask

What happens when you throw an exception from finally block?

The "finally" block execution stops at the point where the exception is thrown. Irrespective of whether there is an exception or not "finally" block is guaranteed to execute. Then the original exception that occurred in the try block is lost.

Under what circumstances will a Finally block run?

The finally block always executes when the try block exits. This ensures that the finally block is executed even if an unexpected exception occurs.

When finally block will not run?

A finally block will not execute due to other conditions like when JVM runs out of memory when our java process is killed forcefully from task manager or console when our machine shuts down due to power failure and deadlock condition in our try block.

Is a finally block executed when an exception is thrown from a try block that does not have a catch block?

In normal case when there is no exception in try block then the finally block is executed after try block. However if an exception occurs then the catch block is executed before finally block.


2 Answers

Yes.

See the documentation:

The finally block always executes when the try block exits.

Exceptions:

Note: If the JVM exits while the try or catch code is being executed, then the finally block may not execute. Likewise, if the thread executing the try or catch code is interrupted or killed, the finally block may not execute even though the application as a whole continues.

like image 11
froadie Avatar answered Oct 10 '22 00:10

froadie


Yes, the finally blocks always runs... except when:

  • The thread running the try-catch-finally block is killed or interrupted
  • You use System.exit(0);
  • The underlying VM is destroyed in some other way
  • The underlying hardware is unusable in some way

Additionally, if a method in your finally block throws an uncaught exception, then nothing after that will be executed (i.e. the exception will be thrown as it would in any other code). A very common case where this happens is java.sql.Connection.close().

As an aside, I am guessing that the code sample you have used is merely an example, but be careful of putting actual logic inside a finally block. The finally block is intended for resource clean-up (closing DB connections, releasing file handles etc), not for must-run logic. If it must-run do it before the try-catch block, away from something that could throw an exception, as your intention is almost certainly functionally the same.

like image 215
GaryF Avatar answered Oct 10 '22 00:10

GaryF