2011-02-15 23 views
23

¿Por qué recibo una advertencia de código inactivo en i ++ en esta función?¿Advertencia de código muerto?

InputFilter hexInputFilter() 
    { 
    return new InputFilter() 
     { 
      @Override 
      public CharSequence filter(CharSequence source, int start, 
        int end, Spanned dest, int dstart, int dend) 
       { 
       for (int i = start; i < end; i++) 
        { 
        if ((source.charAt(i) >= '0') 
          && (source.charAt(i) <= '9')) 
         { 
         return null; 
         } 
        if ((Character.toUpperCase(source.charAt(i)) >= 'A') 
          && (Character.toUpperCase(source.charAt(i)) <= 'F')) 
         { 
         return null; 
         } 
        return ""; 
        } 
       return null; 
       } 
     }; 
    } 
+1

Agregué la etiqueta 'java', ya que esta pregunta es más cercana a Java que a Android. – fiction

+0

Resuelto moviendo el retorno ""; fuera del ciclo y eliminando el retorno final nulo; Gracias a todos por las respuestas rápidas –

Respuesta

55

No hay ninguna posibilidad para el for al bucle más de una vez, porque va a devolver:

return ""; 

Por lo tanto, i++ no se ejecutará nunca y por eso se obtiene una código muerto advertencia . Tal vez quiera eliminar ese return ""; y/o ponerlo fuera del for.

+0

Tiene razón, la devolución ""; se suponía que estaba fuera del circuito. Ahora que lo sé, me salta a la cara: o) Gracias –

13

Esto se debe a que i++ se ejecuta normalmente después del final del bloqueo, y en su función nunca se alcanzará el final del bloque porque en el bloque se devuelve incondicionalmente un valor.

Un ciclo for

for (A; B; C) { 
    D; 
} 

se traduce internamente en lo siguiente:

A; 
while (B) { 
    D; 
    C; 
} 

Se puede ver que si D siempre devuelve desde la función, no se alcanzará C. De eso se trata la queja.

5

Solo ejecutará el ciclo una vez debido a la instrucción return "";.

+0

Usted y Cristian tienen razón. Gracias –

3

En su caso, la instrucción siguiente está causando el problema, ya que se ejecuta incondicionalmente y siempre se ejecutará cuando se ejecuta el ciclo for. Por lo tanto, nunca alcanzará para i ++, por lo que es un código muerto.

return "";