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 ?
Réponses
Trop de publicités?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 valeurtrue
.- 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.