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();
  }
}
Author: xaizek, 2014-08-06

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 valor true.
  • Hay una instrucción alcanzable break que sale de la instrucción while.

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.

 83
Author: Jon Skeet,
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

 22
Author: Ruchira Gayan Ranaweera,
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