14,21. Nicht erreichbare Anweisungen
Es ist ein Kompilierungsfehler, wenn eine Anweisung nicht ausgeführt werden kann, weil nicht erreichbar ist.
Dieser Abschnitt ist einer genauen Erläuterung des Worts "erreichbar" gewidmet. Die Idee ist, dass es eine mögliche Ausführung Pfad vom Anfang des Konstruktors, Methode, Instanz Initialisierer oder statischen Initialisierer geben muss, die die Anweisung an die Anweisung selbst enthält. Die Analyse berücksichtigt die Struktur von Aussagen. Mit Ausnahme der speziellen Behandlung von while, do und für Anweisungen, deren Bedingungsausdruck den konstanten Wert true hat, werden die Werte von Ausdrücken in der Ablaufanalyse nicht berücksichtigt.
Zum Beispiel wird ein Java-Compiler den Code akzeptieren:
{ int n = 5; während (n> 7) k = 2; } obwohl der Wert von n zur Kompilierzeit bekannt ist und im Prinzip zur Kompilierzeit bekannt sein kann, dass die Zuweisung zu k nie ausgeführt werden kann.
Die Regeln in diesem Abschnitt definieren zwei Fachbegriffe:
, ob eine Aussage
erreichbar ist, ob eine Aussage normalerweise
Die Definitionen hier abschließen erlauben eine Aussage nur zu vervollständigen normalerweise, wenn es ist erreichbar.
Um die Beschreibung der Regeln zu verkürzen, wird die übliche Abkürzung "iff" verwendet "wenn und nur wenn".
Eine erreichbare break-Anweisung beendet eine Aussage, wenn innerhalb der Pause Ziels, entweder gibt es keine try-Anweisungen, die versuchen Blöcke enthalten die break-Anweisung, oder gibt es Aussagen versuchen, deren versuchen Blöcke die break-Anweisung enthalten und alle schließlich Klauseln dieser Versuche Anweisungen können normal abgeschlossen werden.
Diese Definition basiert auf der Logik um "Versuche, Kontrolle zu übertragen" in §14.15.
Eine Aussage weiterhin weiterhin eine do-Anweisung, wenn innerhalb der Anweisung tun, entweder gibt es keine try-Anweisungen, deren Blöcke versuchen enthalten die Aussage weiter, oder es werden Aussagen versuchen, deren versuchen Blöcke enthalten die Aussage fortsetzen und alle endlich Klauseln dieser Versuche Anweisungen können normal abgeschlossen werden.
Die Regeln sind wie folgt:
der Block, der Körper eines Konstruktors ist, ein Verfahren, beispielsweise Initialisierer oder statische Initialisierer erreichbar ist.
Ein leerer Block, der kein Schaltblock ist, kann normal abgeschlossen werden, wenn erreichbar ist.
Ein nicht leerer Block, der kein Schaltblock ist, kann normal beendet werden, wenn die letzte Anweisung darin normal abgeschlossen werden kann. Die erste Anweisung in einem nicht leeren Block, der kein Schaltblock ist, ist erreichbar, wenn der Block erreichbar ist.
Jede andere Anweisung S in einem nicht leeren Block, der kein Schalter ist Block ist erreichbar, wenn die Anweisung vor S normal abgeschlossen werden kann.
Eine lokale Klassendeklarationsanweisung kann normal abgeschlossen werden, wenn sie erreichbar ist.
Eine lokale Variablendeklarationsanweisung kann normal abgeschlossen werden, wenn sie erreichbar ist.
Eine leere Anweisung kann normalerweise abgeschlossen werden, wenn sie erreichbar ist.
Markiertes Anweisung kann normalerweise ausgeführt werden, wenn mindestens eine der folgenden zutrifft:
Die enthaltene Anweisung kann normalerweise vervollständigen.
Es gibt eine erreichbare break-Anweisung, die die beschriftete Anweisung beendet.
Die enthaltene Anweisung ist erreichbar, wenn die beschriftete Anweisung erreichbar ist.
Eine Ausdruckanweisung kann normalerweise abgeschlossen werden, wenn sie erreichbar ist.
Eine Wenn-Dann-Anweisung kann normal abgeschlossen werden, wenn sie erreichbar ist.
Die then-Anweisung ist erreichbar, wenn die if-then-Anweisung erreichbar ist.
Eine if-then-else-Anweisung kann normal abgeschlossen werden, wenn die then-Anweisung normal beendet werden kann oder die else-Anweisung normal abgeschlossen werden kann.
Die then-Anweisung ist erreichbar, wenn die if-then-else-Anweisung erreichbar ist.
Die else-Anweisung ist erreichbar, wenn die if-then-else-Anweisung erreichbar ist.
Diese Behandlung einer if-Anweisung, ob sie einen anderen Teil hat oder nicht, ist eher ungewöhnlich. Die Begründung wird am Ende dieses Abschnitts gegeben.
Eine assert-Anweisung kann normal abgeschlossen werden, wenn sie erreichbar ist.
eine switch-Anweisung kann normal abzuschließen iff mindestens einer der folgenden Bedingungen zutrifft:
Der Schaltblock ist leer oder enthält nur Etiketten wechseln.
Die letzte Anweisung im Schaltblock kann normal abgeschlossen werden.
Es gibt mindestens eine Schalterbezeichnung nach dem letzten Schalterblock Anweisungsgruppe.
Der Switch-Block enthält keine Standardbezeichnung.
Es gibt eine erreichbare break-Anweisung, die die switch-Anweisung beendet.
Ein Schalterblock ist erreichbar, wenn seine Schalteranweisung erreichbar ist.
A-Anweisung in einem Schalterblock erreichbar ist genau dann, wenn seine Schalt Anweisung erreichbar und mindestens eine der folgenden Bedingungen erfüllt ist:
es einen Fall oder Standard-Label trägt.
Es gibt eine Anweisung davor im Schaltblock und vorhergehende Anweisung kann normal abgeschlossen werden.
A während Anweisung kann normalerweise mindestens Iff Führen Sie eine der folgenden Aussagen zutreffen :
Die while-Anweisung ist erreichbar und der Bedingungsausdruck ist kein konstanter Ausdruck (§15.28) mit dem Wert wahr.
Es gibt eine erreichbare break-Anweisung, die die while-Anweisung beendet.
Die enthaltene Anweisung ist erreichbar, wenn die while-Anweisung erreichbar ist und der Bedingungsausdruck kein konstanter Ausdruck ist, dessen Wert false ist.
A do Anweisung kann normalerweise iff mindestens eine der folgenden Vorgang auszuführen wahr ist:
Die enthaltene Anweisung kann normalerweise vervollständigen und die Bedingung Ausdruck keinen Konstante Ausdruck (§15.28) mit dem Wert wahr.
Die do-Anweisung enthält eine erreichbare Anweisung ohne Label weiter, und die Aussage zu tun ist die innerste, während, tun oder für Anweisung, die enthält, die Aussage weiter, und die weiterhin Aussage weiterhin diese Aussage tun, und die Bedingung Ausdruck ist kein konstanter Ausdruck mit Wert True.
Die do-Anweisung enthält eine erreichbare Anweisung mit einem Etikett L weiter, und das tun Anweisung hat Etikett L, und die Anweisung continue diese Aussage nicht weiter, und die Bedingung Ausdruck keine konstanter Ausdruck mit dem Wert wahr.
Es gibt eine erreichbare break-Anweisung, die die do-Anweisung beendet.
Die enthaltene Anweisung ist erreichbar, genau dann, wenn die do-Anweisung ist erreichbar.
Eine grundlegende für Anweisung kann normalerweise vervollständigen iff mindestens einer der folgenden Punkte zutrifft:
Die for-Anweisung erreichbar ist, gibt es eine Bedingung, Ausdruck und die Bedingung Ausdruck ist nicht ein konstanter Ausdruck (§ 15.28) mit Wert wahr.
Es gibt eine erreichbare break-Anweisung, die die for-Anweisung beendet.
Die enthaltene Anweisung ist erreichbar, wenn die for-Anweisung erreichbar ist und der Bedingungsausdruck kein konstanter Ausdruck ist, dessen Wert false ist.
Eine erweiterte for-Anweisung kann normalerweise abgeschlossen werden, wenn sie erreichbar ist.
Ein Bruch, continue, return oder throw-Anweisung kann normalerweise nicht abgeschlossen.
Eine synchronisierte Anweisung kann normalerweise vervollständigen iff die enthaltene Anweisung normal abschließen.
Die enthaltene Anweisung ist erreichbar iff die synchronisierte Anweisung ist erreichbar.
Eine try-Anweisung ausführen können normalerweise iff die beiden folgenden sind wahr:
Der try-Block vervollständigen normalerweise kann oder jeder Block fangen kann normalerweise abzuschließen.
Wenn die try-Anweisung einen finally-Block hat, dann kann der finally-Block normal vervollständigen.
Der try-Block ist erreichbar, wenn die try-Anweisung erreichbar ist.
A Fangblock C erreichbar ist iff beide der folgenden Bedingungen erfüllt sind:
Entweder ist die Art des C des Parameters ist ein ungeprüfter Ausnahmetyp oder Throwable; oder einige Ausdruck oder throw-Anweisung im try-Block ist erreichbar und kann eine geprüfte Ausnahme, deren Typ zuweisbare dem Parameter der catch-Klausel C.
Ein Ausdruck ist erreichbar iff die innerste Aussage werfen enthält es erreichbar ist .
Siehe §15.6 für normale und abrupte Vervollständigung von Ausdrücken.
Es gibt keinen früheren catch-Block A in der try-Anweisung, so dass der Typ des C-Parameters der gleiche oder eine Unterklasse des Typs von A ist.
Der Block eines Catch-Blocks ist erreichbar, wenn der Catch-Block erreichbar ist. Wenn ein finally-Block vorhanden ist, ist er erreichbar, wenn die try-Anweisung erreichbar ist.
Java-Sprachspezifikation hat die Antwort: [Nicht erreichbare Anweisungen] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.21) – Christian
@ Gynnad, Sie breche nur wenn z <2, was nicht ist. (Die Frage könnte sich geändert haben) – Holloway