1
resposta

Por que não há o erro 'Unreachable code' quando a instrução if é utilizada?

Quando eu uso este código, por razões óbvias, é gerado um erro de compilação "Unreachable code".

public static void main (String... args){
  while (true);
  System.out.println("test"); //Compilation error: Unreachable code
}

Mas quando eu uso a instrução if antes do while, não é gerado erro de compilação nem de execução:

public static void main (String... args){
  if (true) while (true);
  System.out.println("test"); //Aqui há apenas um warning, mas nenhum erro
}

Por que quando a instrução if é utilizada antes de um loop infinito não é gerado nenhum erro, mesmo o loop sendo bem explícito?

1 resposta

Olá Gregori, tudo bem com você?

Por que quando a instrução if é utilizada antes de um loop infinito não é gerado nenhum erro, mesmo o loop sendo bem explícito?

Antes de mais nada acredito que você esteja utilizando uma IDE como o Eclipse para ter recebido o warning de Dead Code, correto?

É que pela especificação do próprio Java, o bloco de if não é levado em consideração pela análise de código inatingível (unreachable code), na verdade esse warning que recebemos é da própria IDE que tem um compilador otimizado para encontrar esses casos, mas pelo compilador não há erro ou warning de código

Então dado que a condição é atingível, o código após o if também será considerado atingivel

Inclusive na documentação, temos um exemplo parecido:

while (false) { x=3; }

Dizendo que esse código é pego com erro de compilação de código inatingível, entretanto:

if (false) { x=3; }

Não gera um erro de compilação, mesmo sendo inatingível, pois ele não é visto tecnicamente pela especificação como um código errado, e apenas, IDES ou compiladores mais otimizados conseguem capturar esse tipo de diferença :)

Abraços e Bons Estudos!