80 votes

point-virgule à la fin de l'instruction if

Aujourd'hui, après une demi-heure de recherche pour un bug, j'ai découvert qu'il est possible de mettre un point-virgule après l'instruction if au lieu de code, comme ceci:

if(a == b);
//do stuff

ce qui signifie essentiellement que les choses seront fait si a est égal à b ou pas, et si l'instruction n'a pas de point que ce soit. Pourquoi ne pas java me donner une erreur? Est-il une situation où ce serait utile?

92voto

Marcin Szymczak Points 1945

Pourquoi se produit-il?

Java Langage de Spécification dit que:

L'Instruction Vide

Une instruction vide ne fait rien.

EmptyStatement:
    ;

L'exécution d'une instruction vide toujours se termine normalement

Il signifie essentiellement que vous voulez exécuter instruction vide si a==b

if(a == b);

Que devez-vous faire:

Il existe deux solutions à ce problème:

  1. Vous pouvez éviter les problèmes avec les instruction vide en utilisant le code de formatage et en l'entourant de trucs à l'intérieur d' if avec { et }. En faisant cela, Votre déclaration vide sera beaucoup plus lisible.

    if(a == b){
      ;
    }
    
  2. Vous pouvez également vérifier les outils utilisés pour l'analyse statique de code, tels que:

    Elles peuvent immédiatement mettre en lumière des problèmes comme celui-ci.

Je recommande de combiner les deux solutions.

29voto

Tim Medora Points 30969

Est-il une situation où ce serait utile?

Utile? Comme dans "rend votre code plus propre, plus claire, plus rapide, plus facile à gérer"? Pas du tout. Ce risque est plus pauvre, du code source de confusion.

Mais ce n'est pas nécessairement bénignes. Une telle déclaration peut effectuer des actions et/ou de modifier l'état en raison des méthodes de causer des effets secondaires, et éventuellement d'évaluer ces méthodes en raison de court-circuit des opérateurs.

if( a() && b() );

Ici, a() ou b() peut faire quelque chose, et b() ne s'exécutera que si a() est vrai.

Quant à pourquoi, je pense que la réponse est tout simplement qu'il serait pire de s'écarter de défini, le comportement attendu (par exemple des déclarations comme while(reader.read());) que l'alternative de les développeurs à écrire du mauvais code.

Écrire du mauvais code est toujours possible. Et je le redis, ce serait mauvais code dans presque tous les cas.

19voto

gefei Points 7319

un possible cas d'utilisation:

if (a==b);
else {
  // do something
}

pas bon, mais c'est possible.

Encore, je pense que Java Spec devrait interdire vide if

7voto

Edwin Buck Points 33097

C'est un vieux vestige de l'époque où il y avait plus de sucre syntaxique pour différencier les expressions des états.

Fondamentalement, la virgule est utilisée comme élément de la liste séparateur, de sorte que le point-virgule a été utilisé comme la "liste des déclarations" séparateur. L'inconvénient réside dans la gestion de la valeur null éléments dans des listes, et nulle déclarations dans les blocs.

Dans une liste d'éléments, Java utilise le mot clé explicit null, mais un "null déclaration" est juste une ligne vide. En permettant l'existence d'une ligne vide est un vestige de la tradition héritée de C.

Pourquoi le faire? Surtout avec un if déclaration quand on sait qu'aucune des instructions sont en cours d'exécution: Parce que si certains états ont des effets secondaires:

 int c;
 if ((c = in.read()) != -1);

Oui, il n'est pas le meilleur exemple, mais fondamentalement, il dit lire un octet à partir du flux et de ne rien faire. Peut être utile dans certains cas particuliers, mais même si cet exemple n'est pas le meilleur, mais il témoigne de l'intention. Nous voulons nous sentir les effets secondaires de l'expression sans accidentellement de l'exécution de toutes les déclarations.

5voto

Peter Lawrey Points 229686

Je ne peux pas penser à une occasion où il est utile. Il peut être utile pour les boucles comme

 while(do something);

ou

 for(init; do something; something else);

Si vous utilisez votre code de mise en forme de votre IDE régulièrement ce genre de bugs sont devenues évidentes. Quelques IDEs en évidence ce que d'un bug probable que bien.

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