unreachable dead code java dead-code unreachable-code

unreachable - dead code java



if(falso) vs. while(falso): código inalcanzable vs. código muerto (2)

Debes leer las Declaraciones inalcanzables . Aunque con while(false) el compilador generará un error pero con if(false) mostrará una advertencia al usuario.

Aunque if (false) se mantuvo en Java para simular el preprocesador C / C ++ #if 0

La especificación dice que:

if (falso) {x = 3; }

no da como resultado un error en tiempo de compilación. Un compilador de optimización puede darse cuenta de que la declaración x = 3; nunca se ejecutará y puede optar por omitir el código para esa declaración del archivo de clase generado, pero la instrucción x = 3; no se considera "inalcanzable" en el sentido técnico especificado aquí.

La razón de este tratamiento diferente es permitirles a los programadores definir "variables de bandera" tales como:

static boolean final DEBUG = false; y luego escribe un código como:

if (DEBUG) {x = 3; } La idea es que debería ser posible cambiar el valor de DEPURACIÓN de falso a verdadero o de verdadero a falso y luego compilar el código correctamente sin ningún otro cambio en el texto del programa.

Intenté lo siguiente en Eclipse:

  • if (false) {} : advertencia ''código muerto''
  • while (false) {} : error de compilación ''código inalcanzable''

Me preguntaba si existe una "razón" real para esta diferencia. Ya encontré esto ...

Error de compilador de código inalcanzable

... pero ¿por qué no permitirlo while (false) para el mismo propósito de depuración?


La sección JLS sobre el código inalcanzable explica el razonamiento. Esencialmente, Java normalmente no debería usar la compilación condicional como C lo hace rutinariamente con #ifdef , pero hay algunas situaciones (como la depuración y, en particular, la compatibilidad binaria con versiones anteriores) donde es necesario permitir que el compilador elimine completamente el código, por lo que constructo específico if(false) está permitido para ese propósito.