Dois returns em try/finally  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
Sergio Lopes
Moderador
[Avatar]

Membro desde: 17/11/2003 00:22:10
Mensagens: 1368
Localização: São Paulo - SP
Offline

Qual é a lógica de execução de blocos try/catch/finally quando há "return"s envolvidos? Por exemplo: se eu uso um return no bloco try e um return no bloco finally, qual valor será devolvido? Eu queria entender o que é especificado pelo Java para este caso. Procurei no JLS e não encontrei nada específico.

O código abaixo, por exemplo, possui apenas os tais 2 returns. Quando rodado, ele incrementa o i dentro do try mas devolve o valor -1 do return do finally. Por que isso?!?!


Sérgio Lopes - twitter: @sergio_caelum - blog pessoal: sergiolopes.org
Curso Java | Apostilas Java | Arquitetura Java | Curso Rails
Rafael Steil
Administrador
[Avatar]

Membro desde: 31/08/2002 02:35:53
Mensagens: 5984
Localização: São Paulo
Offline

finally *sempre* eh executado, mesmo qdo ha returns.

Rafael

This message was edited 1 time. Last update was at 17/05/2005 02:01:53


"working code attracts people who want to code. Design documents attract people who want to talk about coding - Charles Miller"

http://rafaelsteil.com
http://twitter.com/rafaelsteil
http://www.jforum.net
http://www.flickr.com/photos/rafaelsteil
[Email] [WWW]
Sergio Lopes
Moderador
[Avatar]

Membro desde: 17/11/2003 00:22:10
Mensagens: 1368
Localização: São Paulo - SP
Offline

sim, mas me parece q estão executando os 2 returns! nao?
isso me parece estranho...

Sérgio Lopes - twitter: @sergio_caelum - blog pessoal: sergiolopes.org
Curso Java | Apostilas Java | Arquitetura Java | Curso Rails
Sami Koivu
Virtual Machine Man
[Avatar]

Membro desde: 16/09/2004 09:49:27
Mensagens: 574
Localização: Curitiba-PR
Offline

..provavelmente não vai escalerecer muito, mas..

no nível do java bytecode(que é que as classes compilados contém) os blocos finally são implementados pelo java compiladores com o comando jsr http://java.sun.com/docs/books/vmspec/2nd-edition/html/Instructions2.doc7.html#jsr - que executa uma sub-rotina.

O código dentro do bloco finally é a sub-rotina. E as chamadas com o comando jsr são colocados em cada saída do bloco try-catch. Assim fica garantido que o bloco finally vai sempre executar.

Agora, no seu exemplo, o que acontece é o sequinte:
1) o valor do i está incrementado
2) o bloco finally está sendo chamado
3) depois o valor da i(quer dizer antes da incrementação, ou seja: 0) seria retornado, mas isso nunca acontece, porque o return no bloco finally está executado e a executação sai do metodo retornando -1.

Então só um return está executando, mas dá pra ver que a execução do bloco finally acontece realmente no último momento antes de sair do bloco try.

Talvez o sequinte esclarece um pouqinho.



imprime:

java wrote:
finally :1
-1
1


Então.. o valor do i já foi incrementado quando a execução entrou no bloco finally... mesmo que o valor(da evaluação "i++") que o metodo pretende retornar é 0.

Faz sentido? Desculpa, fico repetindo coisas porque não quero ser mal entendido por causa do meu português imperfeito.

-Sami

(Slightly) Random Broken Thoughts on Java Security
[Email] [WWW] [Yahoo!] [MSN]
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team