El trybloque se completa con la ejecución de la returndeclaración y el valor de sen el momento en returnque se ejecuta la declaración es el valor devuelto por el método. El hecho de que la finallycláusula luego cambie el valor de s(después de que la returndeclaración se complete) no (en ese punto) cambia el valor de retorno.
Tenga en cuenta que lo anterior trata con cambios en el valor de ssí mismo en el finallybloque, no en el objeto al que hace sreferencia. Si sfue una referencia a un objeto mutable (que Stringno lo es) y el contenido del objeto se modificó en el finallybloque, esos cambios se verían en el valor devuelto.
Las reglas detalladas sobre cómo funciona todo esto se pueden encontrar en la Sección 14.20.2 de la Especificación del lenguaje Java . Tenga en cuenta que la ejecución de una returndeclaración cuenta como una terminación abrupta del trybloque (se aplica la sección que comienza " Si la ejecución del bloque try finaliza abruptamente por cualquier otro motivo R ... "). Ver Sección 14.17 del JLS para ver por qué una returndeclaración es una terminación abrupta de un bloque.
A modo de más detalles: si tanto el trybloque como el finallybloque de una try-finallydeclaración terminan abruptamente debido a returndeclaraciones, entonces se aplican las siguientes reglas del §14.20.2:
Si la ejecución del trybloque se completa abruptamente por cualquier otra razón R [además de lanzar una excepción], entonces el finallybloque se ejecuta y luego hay una opción:
- Si el
finallybloque se completa normalmente, la trydeclaración se completa abruptamente por la razón R.
- Si el
finallybloque se completa abruptamente por la razón S, entonces la trydeclaración se completa abruptamente por la razón S (y la razón R se descarta).
El resultado es que la returndeclaración en el finallybloque determina el valor de retorno de toda la try-finallydeclaración, y el valor devuelto del trybloque se descarta. Algo similar ocurre en una try-catch-finallydeclaración si el trybloque arroja una excepción, es atrapado por un catchbloque y tanto el catchbloque como el finallybloque tienen returndeclaraciones.