For esquisito

Estava olhando o guia de certificação do Rafael Pereira e tem uma pergunta com o seguinte for

for(;;){ System.out.println("go"); }
Esse tipo de for apesar de ser esquisito ele é compilado e gera um loop infinito.
Mas se eu coloca-lo antes de um system.out.println ele não compila
e se eu colocar depois compila normalmente.

antes:

public static void main(String [] args){
   System.out.println("teste de for Bizarro");
   for(;;){
      System.out.println("go");
   }
}

depois:

public static void main(String [] args){
   for(;;){
      System.out.println("go");
   }
   System.out.println("teste de for Bizarro");
}

Alguem sabe me explicar o porque?

Imagino que seja porque o compilador reconhece que há um comando após um laço infinito e não permite que isso aconteça já que esse comando nunca vai ser executado, no caso do println() estar depois do for.
O compilador não deu um detalhe específico depois da tentativa de compilação não?

Dá “unreachable code”.

Ele não é tão burrinho assim, o compilador checa se a expressão de checagem não foi passada ou se foi passado true. Nestes casos ele procura se tem algum “break” dentro de for, se não tiver é por que nunca vai sair dali e o trecho abaixo é inalcançável, daí o erro.

É isso aí, qualquer caso de Unreachable Code não compila.

Outro exmplo é quando existe um comando após o return de algum método:

public static void main(String[] args) {
	return;
	System.out.println("Olá");
}

Ahhh sim…é bem claro, mas assim usar um for infinito assim é meio sem noção…sem nenhum break :shock:

esse é um tipo de pergunta q se eu não tivesse testado para ver oq acontece com certeza marcaria que não compilava como marquei no simulado.

Esse for (que o sr. Gosling copiou da linguagem C) é o tipo de coisa que dá um “nó na cabeça” de quem vem de qualquer outra linguagem, já que é equivalente a:

while (true) {
}

mas escrito de forma enigmática.