El try
bloque se completa con la ejecución de la return
declaración y el valor de s
en el momento en return
que se ejecuta la declaración es el valor devuelto por el método. El hecho de que la finally
cláusula luego cambie el valor de s
(después de que la return
declaració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 s
sí mismo en el finally
bloque, no en el objeto al que hace s
referencia. Si s
fue una referencia a un objeto mutable (que String
no lo es) y el contenido del objeto se modificó en el finally
bloque, 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 return
declaración cuenta como una terminación abrupta del try
bloque (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 return
declaración es una terminación abrupta de un bloque.
A modo de más detalles: si tanto el try
bloque como el finally
bloque de una try-finally
declaración terminan abruptamente debido a return
declaraciones, entonces se aplican las siguientes reglas del §14.20.2:
Si la ejecución del try
bloque se completa abruptamente por cualquier otra razón R [además de lanzar una excepción], entonces el finally
bloque se ejecuta y luego hay una opción:
- Si el
finally
bloque se completa normalmente, la try
declaración se completa abruptamente por la razón R.
- Si el
finally
bloque se completa abruptamente por la razón S, entonces la try
declaración se completa abruptamente por la razón S (y la razón R se descarta).
El resultado es que la return
declaración en el finally
bloque determina el valor de retorno de toda la try-finally
declaración, y el valor devuelto del try
bloque se descarta. Algo similar ocurre en una try-catch-finally
declaración si el try
bloque arroja una excepción, es atrapado por un catch
bloque y tanto el catch
bloque como el finally
bloque tienen return
declaraciones.