Unreachable Code :
Każde oświadczenie w dowolnym programie java musi być osiągalne, tzn. każde oświadczenie musi być wykonywalne przynajmniej raz w każdym z możliwych przepływów. Jeśli jakiś kod nie może być wykonywalny w żadnym z możliwych przepływów, wtedy jest nazywany kodem nieosiągalnym. Nieosiągalny kod w java jest błędem czasu kompilacji.
Spójrz na poniższy przykład. Spróbuj skompilować ten przykład.
public class UnreachableCodeInJava{void UnreachableCode_method(boolean b){if(b){return;}else{return;}System.out.println("Unreachable Statement"); //Compile Time Error : Unreachable Code}}
W tym przykładzie linia 14 daje błąd czasu kompilacji : Unreachable Code. Ponieważ to stwierdzenie nie może być osiągnięte w żadnym z przepływów. Jeśli wartość logiczna „b” jest prawdziwa, to blok if zostanie wykonany i sterowanie zostanie zwrócone. Jeśli boolean „b” jest fałszywy, wtedy else blok zostanie wykonany i kontrola zostanie zwrócona. Tak więc, w obu przepływach sterowanie nie dociera do linii 14. Pozostaje ona nieosiągalna. Stąd, daje to błąd czasu kompilacji.
Spójrz na ten przykład.
public class UnreachableCodeInJava{void UnreachableCode_method(boolean b){System.out.println("Reachable Statement");return;System.out.println("Unreachable Statement"); //Compile Time Error}}
W tym przykładzie, UnreachableCode_method() ma tylko jeden przepływ. W tym przepływie tylko, wszystkie oświadczenia muszą być wykonane co najmniej raz. Ale, kontrola powraca tylko w drugim oświadczeniu. Tak więc, trzecia instrukcja staje się nieosiągalna.
Dead Code :
Dead code jest również nieosiągalnym kodem, ale martwy kod nie daje błędu czasu kompilacji. Daje tylko ostrzeżenie.
Na przykład,
public class UnreachableCodeInJava{void UnreachableCode_method(boolean b){System.out.println("Reachable Statement");if(true){return;}System.out.println("Unreachable Statement"); //Dead Code}}
W powyższym przykładzie, blok if będzie zawsze wykonywany, ponieważ przekazujemy do niego stałą wartość „true”. Tak więc, linia 12 staje się nieosiągalna. Chociaż kompilator nie będzie narzekał z tego powodu. Daje tylko ostrzeżenie mówiące, że jest to martwy kod.
Teraz dokonaj małej modyfikacji powyższego przykładu.Zamień blok if na blok while.Skompiluj go i zobacz co się stanie.
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}}
Ten przykład daje błąd czasu kompilacji : Nieosiągalny kod. Ale dlaczego? Dlaczego kompilator zmienia zdanie, gdy widzi while block? Dlaczego nie narzeka na nieosiągalny kod po bloku if??
To dlatego, że,Reguły nieosiągalnego kodu dla różnych bloków takich jak konstruktory, metody, try, catch, if, for, while etc są zdefiniowane indywidualnie w Specyfikacji Języka Java. Zgodnie ze specyfikacją języka Java, Wyrażenie warunkowe bloku If nie będzie oceniane w czasie kompilacji, aby zdecydować o nieosiągalnym kodzie. Dlatego też nie otrzymasz błędu czasu kompilacji w przypadku bloku if. Możesz sprawdzić zasady nieosiągalnego kodu tutaj.