Je me demande pourquoi le code suivant est-il autorisé en Java, sans erreur de compilation? À mon avis, ce code rompt la signature de la méthode en ne renvoyant aucune Ssortingng
. Quelqu’un pourrait-il expliquer ce qui me manque ici?
public class Loop { private Ssortingng withoutReturnStatement() { while(true) {} } public static void main(Ssortingng[] a) { new Loop().withoutReturnStatement(); } }
La finale }
de la méthode est inaccessible – vous obtenez uniquement une erreur de compilation s’il est possible d’arriver à la fin de la méthode sans renvoyer de valeur.
Ceci est plus utile dans les cas où la fin de la méthode est inaccessible en raison d’une exception, par exemple
private Ssortingng find(int minLength) { for (Ssortingng ssortingng : ssortingngs) { if (ssortingng.length() >= minLength) { return ssortingng; } } throw new SomeExceptionIndicatingTheProblem("..."); }
La règle est dans la section JLS 8.4.7 :
Si une méthode est déclarée avoir un type de retour (§8.4.5), alors une erreur de compilation se produit si le corps de la méthode peut se terminer normalement (§14.1).
Votre méthode ne peut pas se terminer normalement, il n’y a donc pas d’erreur. Ce qui est important, ce n’est pas seulement que cela ne peut pas se terminer normalement, mais la spécification reconnaît qu’elle ne peut pas se terminer normalement. De JLS 14.21 :
Une instruction
while
peut se terminer normalement si au moins l’une des conditions suivantes est vraie:
- L’instruction
while
est accessible et l’expression de condition n’est pas une expression constante (§15.28) avec la valeurtrue
.- Il existe une instruction de
break
accessible qui quitte l’instructionwhile
.
Dans votre cas, l’expression condition est une constante avec la valeur true
, et il n’y a pas d’instructions de break
(accessibles ou non), donc l’instruction while
ne peut pas se terminer normalement.
private Ssortingng withoutReturnStatement() { while(true) { // you will never come out from this loop } // so there will be no return value needed // never reach here ===> comstackr not expecting a return value }
Pour plus de précision, essayez ceci
private Ssortingng withoutReturnStatement() { while(true) {} return ""; // unreachable }
Il dit une déclaration unreachable