A return
statement returns control to the invoker of a method (§8.4, §15.11) or
constructor (§8.6, §15.8).
ReturnStatement:
return
Expressionopt;
A return
statement with no Expression must be contained in the body of a method that is declared, using the keyword void
, not to return any value (§8.4), or in the body of a constructor (§8.6). A compile-time error occurs if a return
statement appears within a static initializer (§8.5). A return
statement with no Expression attempts to transfer control to the invoker of the method or constructor that contains it. To be precise, a return
statement with no Expression always completes abruptly, the reason being a return
with no value.
A return
statement with an Expression must be contained in a method declaration that is declared to return a value (§8.4) or a compile-time error occurs. The Expression must denote a variable or value of some type T, or a compile-time error occurs. The type T must be assignable (§5.2) to the declared result type of the method, or a compile-time error occurs.
A return
statement with an Expression attempts to transfer control to the invoker of the method that contains it; the value of the Expression becomes the value of the method invocation. More precisely, execution of such a return
statement first evaluates the Expression. If the evaluation of the Expression completes abruptly for some reason, then the return
statement completes abruptly for that reason. If evaluation of the Expression completes normally, producing a value V, then the return
statement completes abruptly, the reason being a return
with value V.
It can be seen, then, that a return
statement always completes abruptly.
The preceding descriptions say "attempts to transfer control" rather than just "transfers control" because if there are any try
statements (§14.18) within the method or constructor whose try
blocks contain the return
statement, then any finally
clauses of those try
statements will be executed, in order, innermost to outermost, before control is transferred to the invoker of the method or constructor. Abrupt completion of a finally
clause can disrupt the transfer of control initiated by a return
statement.