Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In java,what if both try and catch throw same exception and finally has a return?

public class Abc {
    public static void main(String args[]) {
        System.out.println(Abc.method());
    }

    static int method() {
        try {
            throw new Exception();
        }
        catch(Exception e) {
            throw new Exception();
        }
        finally {
            return 4;
        }
    }
}

Why is the return value 4?

like image 583
Chandra Kanth Avatar asked Feb 26 '11 10:02

Chandra Kanth


People also ask

What will happen when catch and finally block both return value in Java?

When catch and finally block both return value, method will ultimately return value returned by finally block irrespective of value returned by catch block.

Does finally execute if catch throws exception Java?

A finally block always executes, regardless of whether an exception is thrown.

Can we have a return statement in try catch and finally block?

Yes, we can write a return statement of the method in catch and finally block.

What happens if there is a return statements in both the try block and finally block in a function?

If the return in the try block is reached, it transfers control to the finally block, and the function eventually returns normally (not a throw).


2 Answers

That's the way finally works. The snippet

try {
    throw new Exception();
} catch(Exception e) {
    throw new Exception();
}

will complete abruptly, but the finally clause will kick in and when it returns it discards the original reason for completing the statement.

This is explained in section Blocks and Statements in the Java Language Specification. I've highlighted the relevant path in your situation:

A try statement with a finally block is executed by first executing the try block. Then there is a choice:

  • If execution of the try block completes normally, then the finally block is executed, and then there is a choice:
    • ...
  • If execution of the try block completes abruptly because of a throw of a value V, then there is a choice:
    • If the run-time type of V is assignable to the parameter of any catch clause of the try statement, then the first (leftmost) such catch clause is selected. The value V is assigned to the parameter of the selected catch clause, and the Block of that catch clause is executed. Then there is a choice:
      • If the catch block completes normally, then the finally block is executed. Then there is a choice:
        • ...
      • If the catch block completes abruptly for reason R, then the finally block is executed. Then there is a choice:
        • If the finally block completes normally, then the try statement completes abruptly for reason R.
        • If the finally block completes abruptly for reason S, then the try statement completes abruptly for reason S (and reason R is discarded).
    • If the run-time type of V is not assignable to the parameter of any catch clause of the try statement, then the finally block is executed. Then there is a choice:
      • ...
  • If execution of the try block completes abruptly for any other reason R, then the finally block is executed. Then there is a choice:
    • ...
like image 96
aioobe Avatar answered Oct 24 '22 07:10

aioobe


You should never return from a finally block. This is very bad practice. See Java try-finally return design question and Does finally always execute in Java?.

like image 26
JB Nizet Avatar answered Oct 24 '22 06:10

JB Nizet