Ich weiß, dass Zeile 1 / Zeile 2 niemals ausgeführt wird. Aber ich verstehe immer noch nicht, warum ein Kompilierzeitfehler ausgelöst wird. Ich erhalte "Unerreichbare Anweisung" Kompilierfehler.
Bedeutet dies, dass der Compiler prüft, ob er für alle Zweige / Codezeilen kompilieren kann?
Bedeutet dies, dass der Compiler prüft, ob er in der Lage ist, für alle Zweige / Codezeilen zu kompilieren?
Dies bedeutet, dass der Compiler überprüft, ob jede Anweisung erreichbar ist.
Aus Abschnitt 14.21 der JLS :
Es ist ein Fehler bei der Kompilierung, wenn eine Anweisung nicht ausgeführt werden kann, weil sie 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 Erreichbarkeit definiert ist.
Insbesondere sind die relevanten Punkte in Ihrem Fall:
Jede andere Anweisung S in einem nicht leeren Block, der kein Schaltblock ist, ist erreichbar, wenn die Anweisung, die S vorausgeht, normal abgeschlossen werden kann.
Eine
break
,continue
,return
oderthrow
Anweisung kann nicht normal beendet werden.
Der Anweisung "Zeile 1" geht also eine Anweisung voraus ( break;
), die nicht normal abgeschlossen werden kann und daher nicht erreichbar ist.
Der Compiler kann diese Schlussfolgerung auch 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.
Bedeutet dies, dass der Compiler prüft, ob er kompilieren kann alle Zweige / Zeilen des Codes?
Ja Der Compiler kompiliert den gesamten Code und erstellt einen Byte-Code entsprechend Ihrem Code, der klüger genug ist, um unreachable code
auch dead code
zu erkennen. Immediate break
in for-loop
macht andere Anweisungen unerreichbar.
Der Compiler kann feststellen, dass diese beiden Anweisungen niemals ausgeführt werden, und hilft Ihnen, den richtigen Code zu schreiben, indem er sich weigert, ihn zu kompilieren, da dies eine Wahrscheinlichkeit von 99,9% darstellt und keine bewusste Entscheidung für das Hinzufügen von Anweisungen ist das wird nie ausgeführt werden.
Nicht erreichbarer Code ist bedeutungslos und redundant. Wenn Sie in Ihrem Programm nicht erreichbaren Code haben, ist das ein Fehler und muss behoben werden. Daher löst der Compiler einen Fehler aus.
Sie können sich auf ähnliche Fragen unten beziehen
Nicht erreichbarer Code: Fehler oder Warnung? und Warum hat Java einen Compilerfehler "nicht erreichbar"?
Tags und Links java unreachable-code