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?
When catch and finally block both return value, method will ultimately return value returned by finally block irrespective of value returned by catch block.
A finally block always executes, regardless of whether an exception is thrown.
Yes, we can write a return statement of the method in catch and finally block.
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).
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
trystatement with afinallyblock is executed by first executing thetryblock. Then there is a choice:
- If execution of the
tryblock completes normally, then thefinallyblock is executed, and then there is a choice:
- ...
- If execution of the
tryblock completes abruptly because of athrowof a value V, then there is a choice:
- If the run-time type of V is assignable to the parameter of any
catchclause of thetrystatement, then the first (leftmost) suchcatchclause is selected. The value V is assigned to the parameter of the selectedcatchclause, and the Block of thatcatchclause is executed. Then there is a choice:
- If the
catchblock completes normally, then thefinallyblock is executed. Then there is a choice:
- ...
- If the
catchblock completes abruptly for reason R, then thefinallyblock is executed. Then there is a choice:
- If the
finallyblock completes normally, then thetrystatement completes abruptly for reason R.- If the
finallyblock completes abruptly for reason S, then thetrystatement 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
catchclause of thetrystatement, then thefinallyblock is executed. Then there is a choice:
- ...
- If execution of the
tryblock completes abruptly for any other reason R, then thefinallyblock is executed. Then there is a choice:
- ...
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?.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With