191 votes

L’instruction return manquante dans une méthode non void compile

J'ai rencontré une situation où une non-méthode void manque un retour de l'énoncé et le code compile. Je sais que les déclarations après la boucle while sont inaccessible(code mort) et ne sera jamais exécutée. Mais pourquoi ne pas le compilateur même avertir sur le retour de quelque chose? Ou pourquoi un langage nous permettent d'avoir une non-méthode void avoir une boucle infinie et ne pas rentrer quoi que ce soit?

public int doNotReturnAnything() {
    while(true) {
        //do something
    }
    //no return statement
}

Si j'ajoute une instruction de saut(même un conditionnelles) dans la boucle while, le compilateur se plaint de l'infâme erreurs: 'Méthode ne retourne pas de valeur" (Eclipse) et de "ne Pas tous les chemins de code de retour d'une valeur" (Visual Studio)

public int doNotReturnAnything() {
    while(true) {
        if(mustReturn) break;
        //do something
    }
    //no return statement
}

Cela est vrai de Java et en C#

242voto

Eric Lippert Points 300275

Pourquoi une langue qui nous permettent d'avoir une non-méthode void avoir une boucle infinie et ne pas rentrer quoi que ce soit?

La règle de non-méthodes void est chaque chemin de code qui renvoie doit retourner une valeur, et que la règle est satisfaite dans votre programme: zéro de zéro les chemins de code de retour qui ne retournent une valeur. La règle n'est pas "tous les non-nulle méthode doit avoir un chemin de code qui renvoie".

Cela vous permet d'écrire de stub de méthodes comme:

IEnumerator IEnumerable.GetEnumerator() 
{ 
    throw new NotImplementedException(); 
}

C'est une non-méthode void. Il a une non-méthode void afin de satisfaire à l'interface. Mais il semble stupide de faire de cette mise en œuvre illégale, car elle ne retourne rien.

Que votre méthode est inaccessible point de fin à cause d'un goto (rappelez-vous, un while(true) est juste un plus agréable façon d'écrire goto) au lieu d'un throw (ce qui est une autre forme d' goto) n'est pas pertinente.

Pourquoi ne pas le compilateur même avertir sur le retour de quelque chose?

Parce que le compilateur n'a pas de bonnes preuves que le code est erroné. Quelqu'un a écrit while(true) et il semble probable que la personne qui n'a que savaient ce qu'ils faisaient.

Où puis-je lire plus sur une analyse d'accessibilité en C#?

Voir mes articles sur le sujet, ici:

ATBG: de jure et de facto la joignabilité

Et vous pourriez aussi envisager la lecture de la spécification C#.

38voto

sanbhat Points 11558

Le compilateur Java est assez intelligent pour trouver le code inaccessible ( le code après l' while boucle)

et depuis sa inaccessible, il n'y a pas de point à ajouter un return déclaration (après while fin)

en va de même avec conditionnelle if

public int get() {
   if(someBoolean) {   
     return 10;
   }
   else {
     return 5;
   }
   // there is no need of say, return 11 here;
}

depuis la condition booléenne someBoolean ne peut correspondre à la true ou false, il n'est pas nécessaire de fournir un return explicitement après if-else, parce que le code est inaccessible, et Java ne permet pas de s'en plaindre.

17voto

Daniel Hilgarth Points 90722

Le compilateur sait que la boucle ne s’arrêtera jamais l’exécution, donc la méthode sera jamais fini, donc un déclaration n’est pas nécessaire.

14voto

Dave Bish Points 7943

Compte tenu de votre boucle s’exécute sur une constante - le compilateur sait que c’est une boucle infinie - ce qui signifie que la méthode pourrait ne jamais revenir, en tout cas.

Si vous utilisez une variable - le compilateur appliquera la règle :

Cela ne compile pas :

11voto

kocko Points 18585

Les spécifications de Java définit un concept appelé" Unreachable statements. Vous n'êtes pas autorisé à avoir un inaccessible déclaration dans votre code (c'est une erreur de compilation). Vous ne sont même pas autorisés à avoir une instruction de retour après le while(true); déclaration en Java. Un while(true); déclaration fait les déclarations suivantes inaccessible par définition, vous n'avez donc pas besoin d'un return déclaration puisqu'il sera

Noter que tandis que le problème de l'Arrêt est indécidable dans le cas générique, la définition de l'Inaccessible Déclaration est plus stricte que simplement l'arrêter. C'est de décider des cas très spécifiques où un programme n'a décidément pas s'arrêter. Le compilateur n'est théoriquement pas en mesure de détecter toutes les boucles infinies et inaccessible déclarations, mais il a pour détecter des cas spécifiques définis dans le cahier des charges (par exemple, l' while(true) des cas)

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