| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/02/2010 08:47:38
|
TiagoTC
JavaTeenager
Membro desde: 09/02/2008 01:12:58
Mensagens: 189
Offline
|
No seguinte código:
e nesse:
O compilador gera erro de compilação pois ele detecta a recursão sem um critério de parada. Agora, nesse aqui:
Ele compila normalmente e não detecta a recursão infinita do método. Assim, eu postulei que o compilador consegue detectar recursões infinitas apenas em construtores... Porém, tenho 99% de certeza de que eu já fiz um exercício em que tinha uma recursão dessas num construtor e a resposta era "erro em tempo de execução", e não erro de compilação...
Existe alguma regra para saber quando o compilador vai detectar a recursão infinita? O meu postulado é correto?
Obrigado.
|
Pérola: "Nunca coloque seu celular em um forno de microondas, pois isso faz com que a bateria exploda" - Manuais de telefones celulares |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/02/2010 09:10:53
|
Cl?ber Jos
Debugger
![[Avatar]](/images/avatar/47cd88b1d755ffa84889a71a728bc0ab.png)
Membro desde: 26/04/2009 09:58:48
Mensagens: 66
Offline
|
Pelo que eu sei, o erro ocorre pelo estou da pilha, isso durante a execução...
Por isso não é detectado durante a copilação
falou! Espero ter ajudado.
|
"Se não venço pelo talento venço pelo esforço" |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/02/2010 09:17:21
|
entanglement
GUJ Hacker
Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline
|
O erro é "recursive constructor invocation".
Esse erro é extremamente simples de descobrir para o compilador, porque a execução do "this()" é incondicional e deve ser feita no início do construtor.
(Tanto é que em outras linguagens, como em C++ ou C#, o equivalente ao "this" ou o "super" são postos fora das chaves, imediatamente após a declaração dos parâmetros, para enfatizar o fato de sua execução ser necessariamente imposta ANTES do bloco de código do método).
Portanto, uma análise de fluxo simples já resolve.
O compilador não é tão esperto assim como você pensa (para descobrir execuções recursivas sem critério de parada), até porque certas coisas (como rotinas mutuamente recursivas sem critério de parada) são difíceis de descobrir sem uma análise completa do ambiente de execução. Em vez disso, simplesmente o compilador se abstém de tentar descobrir tais coisas no seu código.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/02/2010 09:31:59
|
TiagoTC
JavaTeenager
Membro desde: 09/02/2008 01:12:58
Mensagens: 189
Offline
|
entanglement wrote:O erro é "recursive constructor invocation".
Esse erro é extremamente simples de descobrir para o compilador, porque a execução do "this()" é incondicional e deve ser feita no início do construtor.
(Tanto é que em outras linguagens, como em C++ ou C#, o equivalente ao "this" ou o "super" são postos fora das chaves, imediatamente após a declaração dos parâmetros, para enfatizar o fato de sua execução ser necessariamente imposta ANTES do bloco de código do método).
Portanto, uma análise de fluxo simples já resolve.
O compilador não é tão esperto assim como você pensa (para descobrir execuções recursivas sem critério de parada), até porque certas coisas (como rotinas mutuamente recursivas sem critério de parada) são difíceis de descobrir sem uma análise completa do ambiente de execução. Em vez disso, simplesmente o compilador se abstém de tentar descobrir tais coisas no seu código.
Quer dizer então que podemos afirmar que em construtores essas recursões serão sempre detectadas? Eu tenho quase certeza de que já fiz um exercício que também usava this() chamando recursivamente outro construtor e que o compilador não detectava...
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/02/2010 09:38:06
|
entanglement
GUJ Hacker
Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline
|
TiagoTC wrote:
Quer dizer então que podemos afirmar que em construtores essas recursões serão sempre detectadas? Eu tenho quase certeza de que já fiz um exercício que também usava this() chamando recursivamente outro construtor e que o compilador não detectava...
Poste seu exercício aqui. Pode ser que não seja fácil o compilador detectar esse caso. Lembre-se, o compilador não detecta tudo - muitas coisas não são especificadas pela JLS (Java Language Specification), portanto não precisariam ser detectadas pelo compilador. Um caso desses é a invocação recursiva de construtores, que não é especificada pela JLS e portanto nem deveria ser detectada.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/02/2010 09:43:17
|
TiagoTC
JavaTeenager
Membro desde: 09/02/2008 01:12:58
Mensagens: 189
Offline
|
entanglement wrote:
TiagoTC wrote:
Quer dizer então que podemos afirmar que em construtores essas recursões serão sempre detectadas? Eu tenho quase certeza de que já fiz um exercício que também usava this() chamando recursivamente outro construtor e que o compilador não detectava...
Poste seu exercício aqui. Pode ser que não seja fácil o compilador detectar esse caso. Lembre-se, o compilador não detecta tudo - muitas coisas não são especificadas pela JLS (Java Language Specification), portanto não precisariam ser detectadas pelo compilador. Um caso desses é a invocação recursiva de construtores, que não é especificada pela JLS e portanto nem deveria ser detectada.
É que eu não estou achando ele agora, mas vou procurar melhor durante a noite. Mas, se realmente eu não estiver enganado com relação à esse exercício, na hora do exame eu não vou saber o que colocar (erro de compilação ou execução)
This message was edited 2 times. Last update was at 10/02/2010 09:44:10
|
|
|
 |
|
|