Ich habe diese Frage gerade erst bemerkt und wollte meine $ .02 dazu hinzufügen.
Im Fall von Java ist dies eigentlich keine Option. Der Fehler "Nicht erreichbarer Code" beruht nicht auf der Tatsache, dass JVM-Entwickler dachten, Entwickler vor irgendetwas zu schützen oder besonders wachsam zu sein, sondern auf den Anforderungen der JVM-Spezifikation.
Sowohl der Java-Compiler als auch JVM verwenden sogenannte "Stack-Maps" - eine eindeutige Information über alle Elemente auf dem Stack, die für die aktuelle Methode zugewiesen wurden. Der Typ jedes einzelnen Steckplatzes des Stapels muss bekannt sein, damit ein JVM-Befehl Elemente eines Typs nicht mit einem anderen Typ misshandelt. Dies ist vor allem wichtig, um zu verhindern, dass jemals ein numerischer Wert als Zeiger verwendet wird. Mit der Java-Assembly können Sie versuchen, eine Nummer zu pushen / speichern, dann aber eine Objektreferenz einfügen / laden. JVM lehnt diesen Code jedoch während der Klassenüberprüfung ab. In diesem Fall werden Stapelzuordnungen erstellt und auf Konsistenz getestet.
Um die Stapelzuordnungen zu überprüfen, muss die VM alle in einer Methode vorhandenen Codepfade durchlaufen und sicherstellen, dass die Stapeldaten für jede Anweisung unabhängig davon, welcher Codepfad jemals ausgeführt wird, mit dem übereinstimmen, was der vorherige Code gepusht hat / im Stapel gespeichert. Also, im einfachen Fall von:
Object a;
if (something) { a = new Object(); } else { a = new String(); }
System.out.println(a);
In Zeile 3 prüft JVM, ob beide Zweige von 'if' nur in einem (nur lokalen var # 0) Objekt gespeichert sind, das mit Object kompatibel ist (da Code ab Zeile 3 auf diese Weise lokales var # 0 behandelt ).
Wenn der Compiler zu einem nicht erreichbaren Code gelangt, weiß er nicht genau, welchen Status der Stapel zu diesem Zeitpunkt haben könnte, sodass er seinen Status nicht überprüfen kann. Zu diesem Zeitpunkt kann der Code nicht mehr vollständig kompiliert werden, da er auch die lokalen Variablen nicht verfolgen kann. Anstatt diese Mehrdeutigkeit in der Klassendatei zu belassen, wird ein schwerwiegender Fehler ausgegeben.
Natürlich wird eine einfache Bedingung if (1<2)
es täuschen, aber es täuscht nicht wirklich - es gibt ihm einen potenziellen Zweig, der zum Code führen kann, und zumindest können sowohl der Compiler als auch die VM bestimmen, wie die Stapelelemente von dort aus verwendet werden können auf.
PS Ich weiß nicht, was .NET in diesem Fall tut, aber ich glaube, dass die Kompilierung ebenfalls fehlschlagen wird. Dies ist normalerweise kein Problem für Maschinencode-Compiler (C, C ++, Obj-C usw.).