Boucle infinie interrompt la signature de la méthode sans erreur de compilation

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 valeur true .
  • Il existe une instruction de break accessible qui quitte l’instruction while .

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