O try
bloco é concluído com a execução da return
instrução e o valor de s
no momento em que a return
instrução é executada é o valor retornado pelo método. O fato de a finally
cláusula alterar posteriormente o valor de s
(após a conclusão da return
instrução) não muda (nesse ponto) o valor de retorno.
Observe que o item acima lida com alterações no valor de s
si mesmo no finally
bloco, não no objeto que faz s
referência. Se s
fosse uma referência a um objeto mutável (o que String
não é) e o conteúdo do objeto fosse alterado no finally
bloco, essas alterações seriam vistas no valor retornado.
As regras detalhadas de como tudo isso funciona podem ser encontradas na Seção 14.20.2 da Especificação da linguagem Java . Observe que a execução de uma return
instrução conta como um término abrupto do try
bloco (a seção que inicia " Se a execução do bloco try for concluída abruptamente por qualquer outro motivo, R .... " se aplica). Consulte a Seção 14.17 do JLS para saber por que uma return
instrução é um encerramento abrupto de um bloco.
Por meio de mais detalhes: se o try
bloco e o finally
bloco de uma try-finally
instrução terminam abruptamente devido a return
instruções, as seguintes regras do §14.20.2 se aplicam:
Se a execução do try
bloco for concluída abruptamente por qualquer outro motivo R [além de gerar uma exceção], o finally
bloco será executado e haverá uma opção:
- Se o
finally
bloco for concluído normalmente, a try
instrução será concluída abruptamente pelo motivo R.
- Se o
finally
bloco for concluído abruptamente pelo motivo S, a try
instrução será concluída abruptamente pelo motivo S (e o motivo R será descartado).
O resultado é que a return
instrução no finally
bloco determina o valor de retorno de toda a try-finally
instrução e o valor retornado do try
bloco é descartado. O mesmo ocorre em uma try-catch-finally
instrução se o try
bloco lança uma exceção, é capturado por um catch
bloco e o catch
bloco e o finally
bloco têm return
instruções.