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?
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.
E
entanglement
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.
T
TiagoTC
entanglement:
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…
E
entanglement
TiagoTC:
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.
T
TiagoTC
entanglement:
TiagoTC:
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) :shock: