2012-01-14 18 views
29

En el siguiente método, el compilador se queja de una declaración de devolución faltante aunque solo hay una ruta única a través del método, y contiene una declaración return. Suprimir el error requiere otra declaración return.El compilador se queja de "declaración de devolución faltante" aunque es imposible alcanzar la condición donde falta la declaración de devolución

public int foo() { 
    if (true) { 
     return 5; 
    } 
} 

Dado que el Java compiler can recognize infinite loops, ¿Por qué no manejar esta situación así? La pregunta vinculada sugiere, pero no proporciona detalles para este caso específico.

+2

en 'foo4()' el compilador no es tan inteligente como para comprender que la función siempre devuelve 5. Simplemente verifica que no todas las rutas de códigos devuelven algo. –

+1

si la declaración se trata especialmente en el análisis de flujo, consulte JLS 14.21: * La sentencia if, ... se maneja de una manera inusual. Por este motivo, se trata por separado al final de esta sección * – irreputable

+0

@irreputable En el futuro, si desea disputar el cierre de una pregunta, considere marcar la publicación para la revisión del moderador o publicarla en [meta]. Es mucho más constructivo que correr insultando a personas o destrozando publicaciones. –

Respuesta

12

JLS 14.21, Unreachable Statements es la sección que se ocupa de esto:

La sentencia if, si tiene o no tiene una parte más, se maneja de una manera inusual. Por esta razón, se analiza por separado al final de esta sección.

En última instancia, tiene que ver con cómo se maneja la compilación condicional. Considere este método:

public int foo() { 
    if (DEBUG) { 
     return 5; 
    } 
} 

Si DEBUG es static final boolean true; se podría pensar que el compilador debe ser lo suficientemente inteligente para darse cuenta del método siempre devolverá 5. Pero si se cambia a false, el código ya no es válido.

El método debe ser válido para todos los caminos a través del método de sin un cambio de código fuente, lo que permite la optimización de los compiladores de omitir el código de bytes sin modificaciones de código, independientemente del valor de la bandera.

El very end of the linked JLS section entra en detalles significativos.

+0

+1 referencia JLS. – paislee

+0

@DaveNewton: Actualice la segunda URL (al final de la sección JLS vinculada) –

+0

@Nandkumar ¿Desea actualizar a qué? –

5

La razón por la que el compilador se queja tiene que ver con este punto clave de Section 14.21 of the Java Language Specification, discutiendo declaraciones inalcanzables:

Excepto para el tratamiento especial de while, do y for declaraciones cuya expresión condición tiene la constante valor true, los valores de las expresiones no se tienen en cuenta en el análisis de flujo.

Tenga en cuenta que es ifno uno de los estados que tiene un manejo especial de true condiciones constantes. La razón por la que se excluye de este manejo especial es permitir que if se use como una forma de compilación condicional, como Dave Newton explicó en su respuesta.

+0

Buen punto aún, acepté la respuesta de @Dave Newton ya que él también mencionó cosas buenas. Muchas gracias. – Lion

Cuestiones relacionadas