descargar - java jdk
El compilador se queja de la "declaración de devolución faltante" a pesar de que es imposible alcanzar la condición en la que faltaría la declaración de devolución (2)
La razón por la que el compilador se queja tiene que ver con este punto clave de la Sección 14.21 de la Especificación del lenguaje Java , que discute declaraciones inalcanzables:
Excepto por el tratamiento especial de
while
,do
yfor
declaraciones cuya expresión de condición tiene el valor constantetrue
, los valores de las expresiones no se tienen en cuenta en el análisis de flujo.
Tenga en cuenta que if
no es una de las afirmaciones que tiene un manejo especial de las true
condiciones constantes. La razón por la que se excluye de este manejo especial es permitir que se use como una forma de compilación condicional, como lo explicó Dave Newton en su respuesta.
En el siguiente método, el compilador se queja de una declaración de retorno faltante, aunque solo hay una única ruta a través del método y contiene una declaración de return
. La supresión del error requiere otra declaración de return
.
public int foo() {
if (true) {
return 5;
}
}
Dado que el compilador de Java puede reconocer bucles infinitos , ¿por qué no maneja esta situación también? La pregunta vinculada insinúa, pero no proporciona detalles para este caso específico.
JLS 14.21, Declaraciones inalcanzables es la sección que trata esto:
La instrucción if, tenga o no una parte else, se maneja de una manera inusual. Por esta razón, se discute 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;
podría pensar que el compilador debería ser lo suficientemente inteligente como para darse cuenta de que el 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 todas las rutas a través del método sin un cambio en el código fuente , lo que permite optimizar los compiladores para omitir el código de bytes sin modificaciones en la fuente, independientemente del valor del indicador.
El final de la sección JLS enlazada entra en detalles significativos.