Der Java-Compiler weiß nichts über System.exit
. Es ist nur eine Methode, soweit es sie betrifft - das Ende der Anweisung ist also erreichbar.
Sie sagen dass L1
y L2
sind "sichtbar nicht erreichbar", aber das ist sólo denn Sie wissen, was System.exit
tut. Die Sprache tut es nicht - während sie tut wissen, was ein return
Anweisung, so dass sie weiß, dass L3
wirklich nicht zu erreichen ist.
Ich denke manchmal, dass es nützlich wäre, zu erklären, dass eine Methode nicht nur void
aber niemals wird normal beendet - es kehrt nie einfach zurück (obwohl es eine Ausnahme auslösen kann). Der Compiler wäre dann in der Lage, diese Information zu nutzen, um das Ende eines aufrufenden Ausdrucks unerreichbar zu machen und so zu verhindern, dass diese Art von Dingen ein Problem darstellt. Aber das sind nur meine Träume über Sprachdesign - Java nicht und es wäre eine sehr schlechte Idee, wenn der Compiler "wüsste", dass bestimmte JRE-Methoden niemals normal zurückkehren, wenn dieses Konzept nicht direkt in der Sprache ausgedrückt werden kann.
Stattdessen ist der Compiler an die Regeln der Abschnitt 14.21 der JLS , einschließlich:
- Die erste Anweisung in einem nicht leeren Block, der kein Schalterblock ist, ist erreichbar, wenn der Block erreichbar ist.
- Jede andere Anweisung S in einem nicht leeren Block, der kein Schalterblock ist, ist erreichbar, wenn die Anweisung vor S normal abgeschlossen werden kann.
...
Eine Ausdrucksanweisung kann normal abgeschlossen werden, wenn sie erreichbar ist.
(Ein Methodenaufruf ist eine Ausdrucksanweisung.)
Dann ab Abschnitt 8.4.7:
Wenn eine Methode so deklariert ist, dass sie einen Rückgabetyp hat, dann tritt ein Kompilierfehler auf, wenn der Körper der Methode normal abgeschlossen werden kann (§14.1).
und in 14.1:
Wenn nicht anders angegeben, wird eine Anweisung normal abgeschlossen, wenn alle von ihr ausgewerteten Ausdrücke und alle von ihr ausgeführten Substatements normal abgeschlossen werden.
Die Aufforderung an System.exit()
kann aus Sicht des Compilers normal abgeschlossen werden, was bedeutet, dass der Körper der foo
Methode normal abgeschlossen werden kann, was zu dem Fehler führt.