2013-05-08 7 views
14

Ich war vor kurzem einen Code-Block aus unserer Code-Basis vor einem Release zu entfernen und verwendet, um eine if (false) die Ausführung der Anweisung zu verhindern:Während (false) verursacht nicht erreichbar Anweisungskompilierung Fehler

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

Dies kompiliert fein und verhindert die Ausführung des fehlerhaften Codeblocks (richtig oder falsch, das ist nicht das aktuelle Argument).

jedoch Art von Unfall, änderte ich den Block oben:

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

und erhielt einen unerreichbaren Anweisungskompilierung Fehler.

Ich schätze den Kompilierungsfehler und verstehe die Gründe, aber ich kämpfe, um den Unterschied zwischen den zwei Blöcken zu verstehen und warum ersteres kompiliert, aber das letztere nicht, wenn sie beide unerreichbare Aussagen haben.

+0

Meine Vermutung ist, dass es einen Fehler viel einfacher zu machen Beteiligung 'do-while' als mit' if'. Deshalb sollte der letztere Fall zu einem Fehler führen. – Renan

+0

Meine Vermutung ist, dass die ursprüngliche Absicht des Compilerautors war, beide einen nicht erreichbaren Fehler verursachen zu lassen. Da Programmierpraktiken Leute jedoch haben, die Code mit if (false) normalerweise deaktivieren, erlaubte es das als Spezialfall. – CBass

Antwort

12

In beiden Fällen die Compiler einen Fehler auslösen sollten, da der Code zwischen Klammern im Wesentlichen sinnlos ist, aberif (false) wurde in Java gehalten C/C++ Präprozessor #if 0, eine ganz gewöhnliche Art und Weise der Sperrung Teile des Codes für die Prüfung zu simulieren oder Debugging.

EDIT: als Referenz, "bedingte Kompilierung" ist am Ende der chapter 14.21 der Java Language Specification detailliert.

+1

Eigentlich ist die Programmierpraxis des Deaktivierens von Code mit if (false) älter als das Aufkommen von C/C++. – CBass

+1

Fair. Aber nicht der Teil "unerreichbarer Anweisungsfehler". Java-Architekten sollten sich entschieden haben: Entweder melden sie entweder als toten Code zur Kompilierzeit oder gar nicht. Zumindest sollten sie eine andere, einfache Syntax für die Simulation von '#if 0' verwendet haben. Zum Beispiel "deaktiviert" {} 'oder etwas Ähnliches. –

+0

Ja, ich stimme zu. Wie ich oben bemerkt habe, wette ich ursprünglich, dass beide den Fehler verursacht haben und dann haben sie es für if (false) rückgängig gemacht, weil Programmierer es hassten. Das wäre eine gute Kandidatenfrage an James Gosling. – CBass

1

"Java verwendet einen einfachen Flussanalysealgorithmus, um die häufigsten Fälle von nicht erreichbarem Code zu finden, und alle nicht erreichbaren Codeblöcke werden als Kompilierungsfehler gekennzeichnet. Deshalb ist Ihr" while (false) {...} " Die Anweisung erzeugt einen Fehler

Java macht jedoch eine spezielle Ausnahme für "if (false) {...}", da Programmierer dieses Konstrukt oft während der Entwicklung verwenden, um einen Teil des Programms vorübergehend zu deaktivieren.Deshalb akzeptiert der Compiler Diese Aussage lautet:

Wenn Sie an den Einzelheiten interessiert sind, finden Sie in der Java Language Specification die Beschreibung der unerreichbaren Anweisungen @http://docs.oracle.com/javase/specs/#14.21.

Zitat von http://www.coderanch.com/t/266678/java-programmer-SCJP/certification/false-false

Verwandte Themen