El bucle infinito rompe la firma del método sin error de compilación [duplicado]
Esta pregunta ya tiene una respuesta aquí:
Me pregunto por qué se permite el siguiente código en Java, sin obtener un error de compilación?
En mi opinión, este código rompe la firma del método al no devolver ningún String
.
¿Alguien podría explicarme lo que me estoy perdiendo?
public class Loop {
private String withoutReturnStatement() {
while(true) {}
}
public static void main(String[] a) {
new Loop().withoutReturnStatement();
}
}
2 answers
El }
final del método es inalcanzable - solo se obtiene un error de compilación si es posible llegar al final del método sin devolver un valor.
Esto es más útil para los casos en los que el final del método es inalcanzable debido a una excepción, por ejemplo,
private String find(int minLength) {
for (String string : strings) {
if (string.length() >= minLength) {
return string;
}
}
throw new SomeExceptionIndicatingTheProblem("...");
}
La regla para esto está en la sección JLS 8.4.7:
Si se declara que un método tiene un tipo de retorno (§8.4.5), entonces se produce un error en tiempo de compilación si el cuerpo del método puede completa normalmente (§14.1).
Su método no puede completarse normalmente, por lo tanto no hay error. Es importante destacar que no es solo que no puede completarse normalmente, sino que la especificación reconoce que no puede completarse normalmente. De JLS 14.21:
Una declaración
while
puede completar normalmente iff al menos una de las siguientes es verdadera:
- La instrucción
while
es alcanzable y la expresión de la condición no es una expresión constante (§15.28) con valortrue
.- Hay una instrucción alcanzable
break
que sale de la instrucciónwhile
.
En su caso, la expresión de condición es una constante con valor true
, y no hay ninguna instrucción break
(accesible o no), por lo que la instrucción while
no puede completarse normalmente.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-07 06:13:01
private String withoutReturnStatement() {
while(true) {
// you will never come out from this loop
} // so there will be no return value needed
// never reach here ===> compiler not expecting a return value
}
Para más clarificación prueba esto
private String withoutReturnStatement() {
while(true) {}
return ""; // unreachable
}
Dice unreachable
declaración
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-06 07:36:15