WWL
WWL

Reputation: 165

Java 'finally' clause in a nested 'try' block

Will the following finally clause be executed, if an exception is thrown by the PrintWriter?

try{
   PrintWriter out = new PrintWriter(filename);
   try {
       //output
   } finally {
       out.close();
   }
} catch {
   //handle exception
}

If the PrintWriter throws an exception, then the nested try block will never get executed, but why the nested finally clause will still be executed, even it's nested and skipped?

Updates: I ran some tests, if an exception is thrown before the nested try clause, that nested finally will not be executed. If the exception is thrown inside the nested try clause, then the inner finally and the outter catch will be executed.

Upvotes: 2

Views: 840

Answers (3)

Joop Eggen
Joop Eggen

Reputation: 109567

An uglier variant (sometimes generated by the IDE) one sees also:

// *** UGLY
PrintWriter out = null;
try {
    out = new PrintWriter(filename);
    //output
} catch (IOException e) {
    //handle exception
} finally {
    if (out != null) {
        try {
            out.close();
        } catch (IOException e2) {
            // IGNORE
        }
    }
}

That explains the code a bit: as close may throw an IOException too, the code becomes cumbersome. Your code still needs nested exceptions.

With try-with-resources this can & should be written as:

try (PrintWriter out = new PrintWriter(filename)) {
    //output
} catch (IOException e) {
    //handle exception
} // Automatically closes.

And no longer nested exceptions.

The biggest advantage is that you need not catch any exception, and just add a throws IOException in the method signature.

Upvotes: 0

Ayushi Keshri
Ayushi Keshri

Reputation: 690

Finally block is always executed whether exception is handled or not. Even though their is an error and it reaches to catch block, it will go to finally block to execute the piece of code.

finally block is a block that is used to execute important code such as closing connection, stream etc.

So, Inside try{} block you placed try and finally, but you asked about the catch of outside try ,thus its not going inside the first try block.That finally wont work.

P.S. : If you put finally something like this:

     try{
          try{...}
          finally{...}
        }catch(Exception e){...}
        finally{... }
//in case of exception also , the outside finally is going to work.

P.S.: Though you got your answer , but the concept is for reference of other naive programmers

Upvotes: 1

SteffenJacobs
SteffenJacobs

Reputation: 412

No because the inner try block will not be reached when an exception occurs before and therefore the finally block is not reached either.

Upvotes: 4

Related Questions