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;开发者_StackOverflow
}
}
}
Why is the return value 4?
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 afinally
block is executed by first executing thetry
block. Then there is a choice:
- If execution of the
try
block completes normally, then thefinally
block is executed, and then there is a choice:
- ...
- If execution of the
try
block completes abruptly because of athrow
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 thetry
statement, then the first (leftmost) suchcatch
clause is selected. The value V is assigned to the parameter of the selectedcatch
clause, and the Block of thatcatch
clause is executed. Then there is a choice:
- If the
catch
block completes normally, then thefinally
block is executed. Then there is a choice:
- ...
- If the
catch
block completes abruptly for reason R, then thefinally
block is executed. Then there is a choice:
- If the
finally
block completes normally, then thetry
statement completes abruptly for reason R.- If the
finally
block completes abruptly for reason S, then thetry
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 thetry
statement, then thefinally
block is executed. Then there is a choice:
- ...
- If execution of the
try
block completes abruptly for any other reason R, then thefinally
block 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?.
There are several questions on StakOverflow that explain this.
To make it simple: if you put a return or a throw statement in a finally clause this is the last action of your method. Generally speaking this is a bad practice though.
Finally will always return 4. The finally block will always execute regardless of any exception that is throw in the try and catch blocks.
The fact that the finally block returns a value causes the thrown exception to be swallowed, so it wont propagate out of the method.
精彩评论