2013-08-19 9 views
7
class For1 
{ 
    public static void main(String args[]) 
    { 
    int a = 0; 
    for(;;) 
    { 
     break; 
     System.out.println(a); //Line 1 
     ++a;//Line 2 
    } 
    } 
} 

Ich weiß, dass Linie 1/Linie 2 wird nie ausgeführt werden. Aber ich verstehe immer noch nicht, warum ein Kompilierzeitfehler ausgelöst wird. Ich erhalte "Unerreichbare Anweisung" kompilieren Fehler.Unerreichbare Anweisung kompilieren Fehler in Java

Bedeutet dies, dass der Compiler prüft, ob er für alle Zweige/Codezeilen kompilieren kann?

+0

Werfen Sie einen Blick auf: http://stackoverflow.com/questions/3795585/why-does-java-have-an- Unerreichbarer-Anweisung-Compiler-Fehler – BobTheBuilder

Antwort

5

Der Compiler ist auch in der Lage, diese Schlussfolgerung zu treffen, und nimmt an, dass Sie einen Fehler machen. Und ja, der Java-Compiler macht eine ziemlich gute "Datenflussanalyse". Die häufigste verwandte Nachricht ist diejenige über nicht initialisierte Variablen. Die zweithäufigste ist, glaube ich, genau diese, über den Code nicht erreichbar.

12

Bedeutet dies, dass der Compiler prüft, ob er für alle Zweige/Codezeilen kompilieren kann?

Dies bedeutet, dass der Compiler prüft, ob jede Anweisung erreichbar ist.

Von section 14.21 of the JLS:

Es ist ein Fehler bei der Kompilierung, wenn eine Anweisung nicht ausgeführt werden kann, weil es nicht erreichbar ist.

Dieser Abschnitt ist einer genauen Erklärung des Wortes "erreichbar" gewidmet. Die Idee ist, dass es einen möglichen Ausführungspfad vom Anfang des Konstruktors, der Methode, des Instanzinitialisierers oder des statischen Initialisierers geben muss, der die Anweisung für die Anweisung selbst enthält. Die Analyse berücksichtigt die Struktur von Aussagen.

Der Abschnitt dokumentiert dann, wie die Erreichbarkeit definiert ist.

Insbesondere die entsprechenden Punkte in Ihrem Fall sind:

Jede andere Aussage S in einem nicht leeren Block, der keinen Schalterblock ist erreichbar ist genau dann, wenn die Anweisung S vorhergehenden normal abgeschlossen werden kann.

Eine break, continue, return oder throw Anweisung kann nicht normal abgeschlossen werden.

So Ihre „Linie 1“ Aussage wird durch eine Anweisung (break;) voraus, die nicht vollständig normal, und deshalb unerreichbar es ist.

0

Der Compiler überprüft, ob nach bestimmten Schlüsselwörtern mehr Code vorhanden ist. Ein anderes Schlüsselwort, das eine ähnliche Nachricht verursacht, ist, wenn Sie break durch return ersetzen.

3

Bedeutet es, dass der Compiler überprüft, ob es in der Lage ist für alle Zweige/Zeilen von Code zu kompilieren?

Ja Compiler den ganzen Körper von Code kompiliert und Byte-Code nach Ihrem Code macht, ist es klüger genug unreachable code auch dead code erkennt.Unmittelbar break in der for-loop macht unerreichbar andere Aussagen.

for(;;){ 
    break; 
    ... // unreachable statement 
} 


int i=1; 
if(i==1) 
    ... 
else 
    ... // dead code 
1

Der Compiler ist in der Lage, um zu bestimmen, dass diese beiden Anweisung niemals ausgeführt werden, und hilft Ihnen, richtigen Code schreiben indem sie sich weigern, es zu kompilieren, weil diese 99,9% ige Chance hat eher einen Fehler des Seins als ein bewusstes Möglichkeit, Anweisungen hinzuzufügen, die nie ausgeführt werden.