2012-01-03 11 views
17

Estoy usando Eclipse Helios IDE para nuestro desarrollo de aplicaciones web. En la sección de Problemas en Eclipse, para algunas líneas la descripción se muestra como "Código muerto".lo que significa Dead Code bajo Eclipse IDE Problems Section

¿Alguien podría decirme qué significa realmente Dead Code?

Consulte la captura de pantalla para su referencia.

enter image description here

Por ejemplo esta parte se muestra como código muerto bajo Eclipse

else { 
     int length; 
     if (ar != null) 
      length = Array.getLength(ar); 
     else 
      length = 0; // This line is dead code 
+1

presumiblemente debido a que puede probar que 'ar' nunca será nula allí - sin más código que no puede decir con certeza (pero por lo demás sería un error y estoy más inclinado a buscar errores en tu código que en el compilador de eclipse;)) – Voo

+0

Solo vale la pena señalar: Eclipse a veces se equivoca. He visto a Eclipse Neon dar el error de "código muerto" para el código que probablemente no está muerto. –

Respuesta

35

En Eclipse, "código muerto" es código que nunca será ejecutado. Usualmente está en una rama condicional que lógicamente nunca será ingresada.

Un ejemplo trivial sería la siguiente:

boolean x = true; 
if (x) { 
    // do something 
} else { 
    // this is dead code! 
} 

No es un error, porque todavía java válido, pero es una advertencia útil, especialmente si las condiciones lógicas son complejos, y donde no puede ser Es obvio intuitivamente que se ejecutará el código nunca.

En su ejemplo específico, Eclipse ha calculado que ar siempre será no nulo, por lo que la rama else length = 0 nunca se ejecutará.

Y sí, es posible que Eclipse está mal, pero es mucho más probable que no lo sea.

+0

He modificado mi pregunta, mi pregunta es, por favor dígame ¿cómo puede Eclipse decidir que este es el código muerto? porque, en mi opinión, la sugerencia de Eclipse también podría estar equivocada, ¿sabes? – Pawan

+0

@skaffman, ¿Se ha eliminado el código muerto para que no aparezca en el bytecode? – Pacerier

+0

Me salvó .... –

5

El código de error es código que nunca se ejecutará, p.

boolean b = true 
if (!b) { 
    .... 
    // dead code here 
} 
3

El código muerto significa que no hay forma de que se ejecute este código.

A veces incluso no se puede compilar (como este caso :)

private Boolean dead_code() 
    { 
    return true; 
    //Dead code below: 
    dosomething(); 
    } 

Pero en otros casos esto no es demasiado evidente, por ejemplo, esta declaración:

b=true; 
    [...] 
    if (b==false) 
    { 
    //Dead code 
    } 

Si usted tiene este mensaje, hay es algún error importante en su código. Tienes que encontrarlo, de lo contrario, tu aplicación no funcionará según lo previsto.

+0

Me gusta su primer ejemplo, pero no estoy de acuerdo con "there ** is ** alguna falla importante". Esto no es necesariamente así, por ejemplo, a menudo utilizo un parámetro "debug" booleano estático que ejecutará algún código solo si el parámetro se establece en verdadero. Para las versiones, cambio el parámetro a falso y, como resultado, recibo muchas advertencias de código muerto porque las partes del código de "depuración" nunca se ejecutarán. – THelper

+0

Tienes razón, no pensé en este caso. Eso de hecho sería el resultado de un montón de código muerto. – Force

1

Hay dos tipos de diagnósticos que Eclipse brinda para marcar código que no se ejecutará en el tiempo de ejecución. 1) Código inalcanzable: estas son las advertencias java usuales que siguen las reglas de inactividad del JLS, y también están dadas por javac. Estos deben ser errores de compilación. Ejemplos:

int foo() { 
     return 1; 
     int i = 1; // Unreachable 
    } 
    int foo2() { 
    while (true); 
    int i =1; //Unreachable 
    } 

Hay otros ejemplos más complicados :)

2) código muerto: Este es propias advertencias de análisis estático de Eclipse, y son en su mayoría atado fuera del análisis nulo es decir

void foo() { 
    Object o = null; 
    if (o == null) { 
    } else { 
    // dead code 
    } 

Los ejemplos indicados anteriormente NO deben dar una advertencia de código muerto. es decir,

boolean x = true; 
if (x) { 
    // do something 
} else { 
    // this is dead code! 
} 

no debe dar la advertencia, porque JLS prohíbe el compilador para evaluar el 'valor' de las variables. Todo lo que podemos evaluar es el 'nullness'

Esperanza esto ayuda

1

Puede que tenga una excepción de puntero nulo en las líneas anteriores las líneas "código muerto". Asegúrese de marcar la excepción de "Puntero nulo".

+0

También diría: es posible que tenga una excepción de puntero nulo obviamente compilador :), es decir, una condición si el código que seguramente conducirá a la excepción del puntero nulo en la línea que dio esa advertencia para que incluso el compilador comprenda esto. – XMight

-1

Prueba esto:

while (true) { 
    if(false == true) break; 

} 

S.O.P("I will never reach here!") <-- This code will never be executed. 

El código es válido, ya que cumple con el compilador, sin embargo, en realidad, el bucle nunca salida, y en efecto S.O.P nunca será ejecutado.

0

Es posible que haya utilizado la variable ar anteriormente. Entonces el compilador sabe que la línea en la declaración else nunca se ejecutará. O bien habrá un NullPointerException en el lugar donde usó ar o se ejecutará la primera parte de la declaración if.

0

déjame dar una respuesta para el código muerto.

Ej:

public class UnreachableTest{ 

    public static void main(){ 

     try{ 
      // some code 
     } 
     catch(Exception exc){ 
      throw new NullPointerException(); 
      System.out.println("Unreachable line"); // compile time error 
     } 
    } 

} 

aquí la System.out.println ("línea Inalcanzable"); nunca se ejecuta. que a su vez se considera un código muerto.

Otro ejemplo puede ser:

int func(int i, int j) 
{ 
int sum = i + j; 
return i + j; // never actually using the sum 
} 

simples devuelve la función de i + j; nunca usa la suma Suma se considera código muerto aquí.

0

Algún otro caso cuando esto sucede.

System.out.println("result :" + result + ":" + result.isEmpty()); 
if (result == null) 
    return result; 
else if(!result.isEmpty()) 
    str.append(result + " "); 

1) Aquí, como se va a imprimir resultado y comprobar estaVacia() asume que el eclipse resultado no es nulo por lo que no va a ir en si. Entonces el resultado de la devolución es un código muerto.

2) Ahora vamos a decir que está llegando resultado nulo por lo que obtendrá NullPointerException en result.isEmpty() así que de nuevo no va a ir en si y el resultado es volver deadcode

Para hacer este trabajo solo comente sistema. out.println().

0

Eclipse emite esta advertencia si la verificación de condición que realiza nunca puede cumplirse.Los siguientes son algunos ejemplos

Object o=null; 
if(o!=null) { 
//Some code 

} 

advertencia de código Aquí Muerto vendrá como objeto ya está hecho nula

Otro ejemplo sería el siguiente

BSTTest bstTest=null; 
bstTest.test=10; 
if(bstTest==null) { 
    //some code 

} 

Aquí el código está intentando acceder a una variable de la clase. Como la variable ya está accedida, eclipse dará advertencia de código muerto en if (bstTest == null) ya que bstTest puede no ser nulo cuando la variable ya está accedida.

Nota: Aquí bstTest.test dará excepción de puntero nulo

Cuestiones relacionadas