2010-12-30 16 views
7

¿Por qué este método (prueba) necesita un valor de retorno (siempre es cierto)?¿Por qué el método requiere un valor de retorno después de una declaración que siempre es verdadera?

public boolean test() { //This method must return a result of type boolean 
    if (true) { 
     return true; // always return true 
    } 
} 

y cuando he añadido valor de retorno, se advierte como "El código muerto". Así que, ¿por qué no aceptar la primera test() método

public boolean test(int i) { 
    if (true) { 
     return true; 
    } else { //Dead code 
     return false; 
    } 
} 
+3

Si una declaración siempre va a ser verdad, no puedes quitar la instrucción en total? –

+0

es solo prueba.No tengo ningún método que siempre devuelva verdadero :) –

+3

Por lo tanto, no siempre va a ser cierto, por lo que hay más de una ruta a través del código, por lo que necesita una declaración de devolución para cada ruta –

Respuesta

11

El análisis de devolución de método no analiza la condición if para ver si es siempre verdadera o falsa, ya que generalmente no sería una constante de tiempo de compilación (de lo contrario, no estaría escribiendo un if en primer lugar) Simplemente ve que hay un if que podría o no podría tomarse, y si no se toma, entonces el método no devuelve un valor, de ahí el error.

El análisis del código inactivo se realiza en un pase separado al análisis de devolución del método, que hace un análisis más profundo que se ve dentro de las condiciones de la sucursal.

Mi suposición completamente desinformada es que este comportamiento es un artefacto de cómo se desarrolló el compilador; El análisis de retorno del método es una parte vital de la compilación, para garantizar que obtenga un programa válido al final, y también una de las características principales implementadas primero. El análisis del código muerto es "agradable de tener" y así se implementó más adelante, utilizando algoritmos más sofisticados (ya que los bits del compilador central se terminaron en esa etapa)

+0

+1 para señalar que el compilador no evaluará si las condiciones – Babar

2

Es un resultado de la profundidad del análisis que el compilador hace.

1

Este método no hace nada, entonces sí, es código muerto Si el método siempre devuelve verdadero, no necesita llamarlo, solo use true.

+0

es solo una prueba. No tengo ningún método que siempre devuelva verdadero :) –

+1

@hilal, el compilador intenta detectar errores comunes, no trata de manejar todos los casos teóricos posibles y trata de deducir lo que podría querer suceder. –

1

En Java, si especifica un tipo de devolución (booleano) debe especificar explícitamente el valor, independientemente de si es siempre el mismo. Eso plantea la pregunta: si es siempre lo mismo, ¿por qué devolver algo? Ya sabes la respuesta en el código de llamada.

Por qué no acaba de escribir:

public boolean test() { 
    return true; 
} 

En cuanto a la segunda parte de su pregunta, el compilador ve que la segunda vía no se toma en la sentencia if y le da una advertencia al respecto.

0

Si prueba algo, puede ser un valor u otro valor. Entonces no puedes garantizar que va a entrar dentro de la declaración if.

if (someBoolean){ 
    return true; 
} 

no funciona, ya que algunosBoolean pueden ser verdaderos o falsos. Si su método debe devolver algo y someBoolean es falso, no devolverá nada. lo tanto, en este caso, se puede hacer:

if (someBoolean){ 
    return true; 
} 

return false;

o simplemente

return someBoolean; 
Cuestiones relacionadas