65 votes

Signature de méthode de sauts de boucle infinie sans erreur de compilation

Je me demande pourquoi le code suivant est autorisé en Java, sans faire d’erreur de compilation ? À mon avis, ce code rompt la signature de méthode en ne renvoyant pas tout `` . Quelqu'un pourrait m’expliquer ce qui me manque ici ?

83voto

Jon Skeet Points 692016

La finale } de la méthode est accessible, vous obtenez seulement une erreur de compilation si il est possible d'obtenir à la fin de la méthode, sans avoir à retourner une valeur.

C'est plus utile pour les cas où la fin de la méthode est inaccessible en raison d'une exception, par exemple

private String find(int minLength) {
    for (String string : strings) {
        if (string.length() >= minLength) {
            return string;
        }
    }
    throw new SomeExceptionIndicatingTheProblem("...");
}

La règle pour ce qui est de la JLS section 8.4.7:

Si une méthode est déclarée pour avoir un type de retour (§8.4.5), puis une erreur de compilation se produit si le corps de la méthode peut se terminer normalement (§14.1).

Votre méthode peut pas se terminer normalement, donc il n'y a pas d'erreur. Surtout, il n'est pas seulement qu'il ne peut pas se terminer normalement, mais la spécification reconnaît qu'il ne peut pas se terminer normalement. De JLS 14.21:

Un while déclaration peut se terminer normalement le forum au moins une des conditions suivantes est remplie:

  • L' while déclaration est accessible et l'expression de condition n'est pas une expression constante (§15.28) avec la valeur true.
  • Il est joignable break déclaration qui sort de l' while déclaration.

Dans votre cas, la condition de l'expression est une constante avec la valeur true, et il n'y a pas tout break des déclarations (accessible ou non) si l' while déclaration ne peut pas se terminer normalement.

22voto

<pre><code></code><p>Pour plus de précisions, essayez ceci</p><pre><code></code></pre><p><code></code>déclaration</p></pre>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X