What exactly does a finally
block in exception handling perform?
Though there are many answers have already given that finally
block is required to execute some piece of code in all the conditions whether there is some interruption due to exception, or some bad code, or you return the program control flow from try
block, Here I'm adding an example to explain the need of finally
block;
Let's suppose you have borrowed a pen from your friend. You use it and then return ( I consider you a gentleman). Now whatever happens, you have to return the pen. You can handle various situations and you put most unavoidable condition in finally
block.
//Borrow the pen
try{
//Use the pen
}catch(StolenPen how){
//Buy new pen
}catch(InkFinished how){
//Refill the pen
}catch(SomethingWrong how){
//Buy new pen
}finally{
//Return new pen
}
finally block is mainly used to perform close statement for example con.close that is to close connection from database....try block is always followed by either catch block or finally (or both also)...If you once entered in the try block then your finally block will be definately execute except system error,exception in finally block....Main key point of finally block is that it always be executed even the exception is handled or not..
The finally block always executes, regardless of whether or not the exception was thrown. The classic use example I can think of is closing files.
FileOutputStream stream = null;
try{
// do stuff with the stream here
} catch (IOException ex){
// handle exception
} finally{
// always close the stream
if(stream != null){
stream.close();
}
}
If you return a value in your try
or catch
block as well as in the finally
block, keep in mind that the finally
block's return value is what you'll end up with (the last block executed). That means if you try
some code that does NOT throw an Exception
and is supposed to return a value, but your finally
block is also supposed to return a value, the finally
block's value is what will actually be returned. This SO thread talks about that very point. I don't believe returning a value inside a try
or catch
is usually necessary or the best idea. Also note that System.exit(0)
kills the JVM and thus halts execution before anything else runs, which might render your finally
block unexecuted.
It holds code that should always be executed, regardless of whether an exception occurs.
For example, if you have opened a file, you should close it in the finally
block to ensure that it will always be closed; if you closed it in the try
block, an earlier exception would cause execution to jump straight to the catch
block and skip closing the file.
See the Java tutorials for more details.
I use it a lot for cleaning up open resources when there are multiple return statements in a block of code, making the code a lot cleaner as you don't need to clone the same 'close resource' code before every return statement. It's guaranteed that the code will call the finally section, even if you do a return within the try section. It also helps with code safety in this instance, since the programmer could easily leave it out by accident.