Unreachable Code :
Todas as declarações em qualquer programa java devem ser alcançáveis, ou seja, todas as declarações devem ser executáveis pelo menos uma vez em qualquer um dos fluxos possíveis. Se qualquer código não pode ser executável em qualquer um dos fluxos possíveis, então ele é chamado de código inalcançável. Código inalcançável em java é um erro de tempo de compilação.
Vejam o exemplo a seguir. Tente compilar este exemplo.
public class UnreachableCodeInJava{void UnreachableCode_method(boolean b){if(b){return;}else{return;}System.out.println("Unreachable Statement"); //Compile Time Error : Unreachable Code}}
Neste exemplo, a Linha 14 dá erro de tempo de compilação : Código inalcançável. Porque esta declaração não pode ser alcançada em nenhum dos fluxos. Se o booleano “b” for verdadeiro, então se o bloco será executado e o controle será retornado. Se o booleano “b” for falso, então o bloco será executado e o controle será retornado. Portanto, em ambos os fluxos o controle não está vindo para a Linha 14. Continua inalcançável. Portanto, ele dá erro de tempo de compilação.
Dê uma olhada neste exemplo.
public class UnreachableCodeInJava{void UnreachableCode_method(boolean b){System.out.println("Reachable Statement");return;System.out.println("Unreachable Statement"); //Compile Time Error}}
Neste exemplo, UnreachableCode_method() tem apenas um fluxo. Neste exemplo, UnreachableCode_method() tem apenas um fluxo. Neste fluxo apenas, todas as instruções têm que ser executadas pelo menos uma vez. Mas, o controle está retornando apenas no segundo comando. Então, o terceiro comando torna-se inalcançável.
Dead Code :
Dead code is also unreachable code, but dead code does not give compile time error. Ele apenas lhe dá um aviso.
Por exemplo,
public class UnreachableCodeInJava{void UnreachableCode_method(boolean b){System.out.println("Reachable Statement");if(true){return;}System.out.println("Unreachable Statement"); //Dead Code}}
No exemplo acima, se o bloco será sempre executado, pois estamos passando o valor constante “verdadeiro” para ele. Assim, a Linha 12 torna-se inalcançável. Embora o compilador não irá reclamar sobre isso. Ele só dá um aviso dizendo que é um código morto.
Agora, faça pequenas modificações no exemplo acima.Substitua o bloco if por while.Compile-o e veja o que acontece.
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}}
Este exemplo dá erro de tempo de compilação : Código inalcançável. Mas porquê? Porque é que o compilador muda de ideias quando vê enquanto bloco? Porque ele não reclama de código inalcançável depois de se bloco?
Isso é porque,As regras de código inalcançável para diferentes blocos como construtores, métodos, tentativa, captura, se, para, enquanto etc são definidos individualmente na Especificação da Linguagem Java. De acordo com a Especificação da Linguagem Java, a expressão condicional de If block não será avaliada em tempo de compilação para decidir o código inalcançável. É por isso que você não receberá erro de tempo de compilação em caso de se bloco. Você pode verificar as regras do código inalcançável aqui.