2013-05-08 15 views
14

Byłem niedawno usuwając blok kodu z naszej bazy kodu przed wydaniem i używane if (false) oświadczenie, aby zapobiec wykonanie:Chociaż (fałsz) powoduje błąd kompilacji nieosiągalny oświadczenie

if (false) { 
    ArrayList<String> list = new ArrayList<String>(); 
    ... 
} 

To kompiluje grzywny i uniemożliwi wykonanie naruszającego blok kodu (prawy lub zły, to nie jest aktualny argument).

Jednak rodzaju przez przypadek zmieniłem blok wyżej:

while (false) { 
    ArrayList<String> list = new ArrayList<String>(); 
    ... 
} 

i otrzymał oświadczenie nieosiągalny błąd kompilacji.

Doceniam błąd kompilacji i rozumiem powody, jednak staram się zrozumieć różnicę między tymi dwoma blokami i dlaczego pierwszy kompiluje dobrze, ale drugi nie, gdy oba mają nieosiągalne oświadczenia.

+0

Domyślam się, że jest dużo łatwiej popełnić błąd udziałem 'zrób while' niż' if'. To właśnie dlatego ten drugi przypadek prowadzi do błędu. – Renan

+0

Domyślam się, że pierwotną intencją autora kompilatora było spowodowanie nieosiągalnego błędu. Jednak ponieważ w praktyce programistycznej ludzie często wyłączają kod za pomocą opcji (false), dozwolono to jako specjalny przypadek. – CBass

Odpowiedz

12

Zarówno w przypadku kompilator powinien podnieść błąd, ponieważ kod między szelkami jest w zasadzie bezcelowe, aleif (false) utrzymywano w języku Java, aby symulować C/C++ preprocesora #if 0, dość powszechnym sposobem wyłączania części kodu do testowania lub debugowanie.

EDYCJA: dla porównania, "kompilacja warunkowa" jest szczegółowo opisana na końcu chapter 14.21 specyfikacji języka Java.

+1

Właściwie programowanie wyłączania kodu z if (false) poprzedza nadejście C/C++ długim strzałem. – CBass

+1

Targi. Ale nie chodzi o część "nieosiągalnego błędu". Architekci Java powinni zdecydować: albo zgłosić jako martwy kod w czasie kompilacji, albo nie. Przynajmniej powinni zastosować inną, prostą składnię do symulacji '#if 0'. Na przykład 'disabled {}' lub coś podobnego. –

+0

Tak, zgadzam się. Tak jak pisałem powyżej, założę się, że pierwotnie oba spowodowały błąd, a następnie anulowały go, jeśli (false), ponieważ programiści go nienawidzili. Byłoby to dobre pytanie kandydata do wysłania do Jamesa Goslinga. – CBass

1

"Java używa prostego algorytmu analizy przepływu, aby znaleźć najczęstsze przypadki nieosiągalnego kodu, a wszystkie takie nieosiągalne bloki kodu zostaną oznaczone jako błędy w czasie kompilacji." "While (false) {...}" instrukcja generuje błąd:

Jednak Java tworzy specjalny wyjątek dla "if (false) {...}", ponieważ programiści często używają tej konstrukcji podczas programowania w celu tymczasowego wyłączenia części programu, dlatego kompilator akceptuje To oświadczenie:

Jeśli są Państwo zainteresowani szczegółowymi informacjami na temat języka Java, zobacz opis nieosiągalnych wyciągów @http://docs.oracle.com/javase/specs/#14.21. "

Cytat z http://www.coderanch.com/t/266678/java-programmer-SCJP/certification/false-false

Powiązane problemy