Dúvida sobre 'Unreachable code': Porque em loops ocorre mas em if(false)... não ocorre?

Uma dúvida/curiosidade

[code]class Foo {
public static void main( String[] args ) {
if(false)
System.out.println(“OK”);

	while(false)
		System.out.println("Unreachable code");

}[/code]

Alguém sabe porque com um código ‘inalcançável’ como if(false) não ocorre erro de compilação “Unreachable code”, mas loops for e while ocorre ?

E uma dica para o pessoal que está estudando:

do System.out.println("OK"); while(false);

Com esse código não ocorre “Unreachable code” já que o código em do-while é executado pelo menos a primeira vez…

Acredito que o compilador não reclame disso porque é um costume muito comum em Java você desativar uma região de seu código usando “if (false)”, em vez de simplesmente tentar comentar tudo (como você deve saber, comentar tudo não é tão simples quanto parece - se você não tiver uma IDE, só o vi ou notepad, isso pode ser muito tedioso e sujeito a erros). Como em Java não existe preprocessador (algo como “#if 0” do C ou C++ para desativar uma região de seu código, ou #if (False) do C#) então esse costume vem desde o começo da linguagem.

[quote=entanglement]Acredito que o compilador não reclame disso porque é um costume muito comum em Java você desativar uma região de seu código usando “if (false)”, em vez de simplesmente tentar comentar tudo (como você deve saber, comentar tudo não é tão simples quanto parece - se você não tiver uma IDE, só o vi ou notepad, isso pode ser muito tedioso e sujeito a erros). Como em Java não existe preprocessador (algo como “#if 0” do C ou C++ para desativar uma região de seu código, ou #if (False) do C#) então esse costume vem desde o começo da linguagem.
[/quote]

Desculpe, mas qual o problema disso:

/*
if (blablabla){
....
}
*/

Ee fosse comentar tudo com // eu até concordaria, mas como existem comentários de multiplas linhas, não existe a menor necessidade disso.

Puxa, é que se você tiver isto aqui:

bla bla bla /* ble ble ble */  bli bli blo // blu blu blu;
ble blox blix;
bla bla bla /* ble ble ble */  bli bli blo // blu blu blu;
ble blox blix;
bla bla bla /* ble ble ble */  bli bli blo // blu blu blu;
ble blox blix;
//bla bla bla /* ble ble ble */  bli bli blo // blu blu blu;
ble blox blix;
bla bla bla /* ble ble ble */  bli bli blo // blu blu blu;
ble blox blix;

onde você já tem alguns comentário de múltiplas linhas, para comentar esse bloco inteiro de código fica complicado (você teria de ficar, na verdade, pondo “//” no começo de cada linha para ser mais seguro. Algo como:

//bla bla bla /* ble ble ble */  bli bli blo // blu blu blu;
//ble blox blix;
//bla bla bla /* ble ble ble */  bli bli blo // blu blu blu;
//ble blox blix;
//bla bla bla /* ble ble ble */  bli bli blo // blu blu blu;
//ble blox blix;
////bla bla bla /* ble ble ble */  bli bli blo // blu blu blu;
//ble blox blix;
//bla bla bla /* ble ble ble */  bli bli blo // blu blu blu;
//ble blox blix;

Isso é trivial para uma IDE fazer, mas se você tiver de editar um programa Java e sua única ferramenta for um vi, via Telnet, ou um notepad, você terá problemas sérios para fazer as coisas direito (e para voltar as correções para trás). É por isso que o tal do “if (false)” é um “idioma” antigo da linguagem.

Sim, neste caso realmente não tem solução. Mas vc concorda que:

while(false){
sysout... /* To no LooP!!!!*/ sysout...
}

Tbm da o mesmo problema? O engraçado é o compilador reclamar de um e não do outro. O certo (IMHO) seria alertar com um warning nos dois casos.

Vai entender… :roll:

[]'s

Ora, é exatamente pelo motivo que tradicionalmente (desde o tempo em que o Java se chamava Oak e era só um protótipo no computador do James Gosling) o método tradicional de desativar um bloco de código é “if (false)”, não “while (false)”. Isso é porque se você quer reativar o bloco de código, basta trocar “if (false)” por “if (true)”, mas obviamente usar “while (true)” não reativa o bloco de código, e sim cria um loop infinito, que não é o que você quer.