Unreachable Code :
Jede Anweisung in einem Java-Programm muss erreichbar sein, d.h. jede Anweisung muss mindestens einmal in einem der möglichen Abläufe ausführbar sein. Wenn ein Code in keinem der möglichen Abläufe ausführbar ist, wird er als unerreichbarer Code bezeichnet. Unerreichbarer Code in Java ist ein Kompilierzeitfehler.
Schauen Sie sich das folgende Beispiel an. Versuchen Sie, dieses Beispiel zu kompilieren.
public class UnreachableCodeInJava{void UnreachableCode_method(boolean b){if(b){return;}else{return;}System.out.println("Unreachable Statement"); //Compile Time Error : Unreachable Code}}
In diesem Beispiel gibt Zeile 14 einen Kompilierzeitfehler: Unreachable Code. Weil diese Anweisung in keinem der Abläufe erreicht werden kann. Wenn der boolesche Wert „b“ wahr ist, wird der if-Block ausgeführt und die Kontrolle wird zurückgegeben. Wenn der boolesche Wert „b“ falsch ist, wird der else-Block ausgeführt und die Kontrolle wird zurückgegeben. In beiden Abläufen kommt die Kontrolle also nicht in Zeile 14 an. Sie bleibt unerreichbar. Daher gibt es einen Kompilierzeitfehler.
Schauen Sie sich dieses Beispiel an.
public class UnreachableCodeInJava{void UnreachableCode_method(boolean b){System.out.println("Reachable Statement");return;System.out.println("Unreachable Statement"); //Compile Time Error}}
In diesem Beispiel hat UnreachableCode_method() nur einen Fluss. Nur in diesem Fluss müssen alle Anweisungen mindestens einmal ausgeführt werden. Die Kontrolle wird jedoch erst bei der zweiten Anweisung zurückgegeben. Also wird die dritte Anweisung unerreichbar.
Toter Code :
Toter Code ist auch unerreichbarer Code, aber toter Code gibt keinen Kompilierzeitfehler. Er gibt nur eine Warnung aus.
Zum Beispiel:
public class UnreachableCodeInJava{void UnreachableCode_method(boolean b){System.out.println("Reachable Statement");if(true){return;}System.out.println("Unreachable Statement"); //Dead Code}}
Im obigen Beispiel wird der if-Block immer ausgeführt, da wir ihm den konstanten Wert „true“ übergeben. Somit wird Zeile 12 unerreichbar. Der Compiler wird sich jedoch nicht darüber beschweren. Er gibt nur eine Warnung aus, die besagt, dass es sich um einen toten Code handelt.
Nun nehmen Sie eine kleine Änderung am obigen Beispiel vor und ersetzen Sie den if-Block durch einen while-Block.Kompilieren Sie es und sehen Sie, was passiert.
public class UnreachableCodeInJava{static void UnreachableCode_method(boolean b){System.out.println("Reachable Statement");while(true){return;}System.out.println("Unreachable Statement"); //Compile Time Error}}
Dieses Beispiel gibt einen Kompilierzeitfehler: Unreachable code. But why? Warum ändert der Compiler seine Meinung, wenn er den while-Block sieht? Warum beschwert er sich nicht über unerreichbaren Code nach dem if-Block?
Das liegt daran, dass die Regeln für unerreichbaren Code für verschiedene Blöcke wie Konstruktoren, Methoden, try, catch, if, for, while usw. einzeln in der Java Language Specification definiert sind. Gemäß der Java Language Specification wird der bedingte Ausdruck des If-Blocks bei der Kompilierung nicht ausgewertet, um den unerreichbaren Code zu bestimmen. Aus diesem Grund erhalten Sie keinen Kompilierzeitfehler im Falle eines If-Blocks. Sie können die Regeln für unerreichbaren Code hier nachlesen.