2010-04-09 18 views
6
boolean r = false ; int s = 0 ; 
while (r == false) ; 
{ 
    s = getInt() ; 
    if (!(s>=0 && s<=2)) System.out.println ("try again not a valid response") ; 
    else r = true ; 
} 

Le texte ne s'affiche jamais même si un 3 ou un 123 est entré et que la boucle ne se termine jamais. Qu'est-ce qui ne va pas ici?Quel est le problème avec cette boucle?

+0

De même, ce n'est pas une boucle infinie, donc la balise 'infinite-loop' n'a pas de sens. –

+3

En fait, c'est une boucle infinie. 'while (r == false);' est une boucle infinie ne faisant rien, puisque r est initialisé à false. –

+7

Arrêtez d'essayer de mettre plusieurs choses sur une ligne. Autant que n'importe quoi, c'est ce qui a causé votre problème. Une fois que vous avez pris l'habitude d'écrire clairement, vous verrez que ce genre de chose arrive beaucoup moins. Également mettre vos avertissements en éclipse plus haut - il aurait dû vous indiquer la déclaration vide. Ne pas simplement résoudre ce problème, réparer les causes profondes. –

Répondre

32

Vous avez un point-virgule après la condition. Lorsque vous utilisez des accolades pour spécifier un bloc pour votre while, vous n'utilisez pas de point-virgule.

+2

en effet. c'est le problème – David

+5

Hehe ... 'while (r == false)/* NE RIEN * * /;' – Armstrongest

9

Supprimer le ';' après tout.

8

D'autres ont signalé le bug, mais votre code est effrayant d'une autre manière qui finira par vous faire trébucher:

if (!(s>=0 && s<=2)) System.out.println ("try again not a valid response") ; 
else r = true ; 

C'est mauvais parce que vous pouvez facilement l'intention plus d'une instruction à exécuter dans le cas de la clause if ou else. Utilisez des accolades et évitez de placer des instructions conditionnelles sur une seule ligne:

if (!(s>=0 && s<=2)) 
{ 
    System.out.println ("try again not a valid response"); 
} 
else 
{ 
    r = true; 
} 

Il est plus facile à lire et beaucoup moins susceptibles d'introduire difficiles à voir bugs.

+2

Je ne suis pas d'accord sur l'utilisation des accolades. Si c'est une seule déclaration, c'est une seule déclaration. En termes de style, je vais indenter mais ne pas utiliser de curlies pour des déclarations simples ... mais c'est une bataille religieuse. – Armstrongest

+2

@Atomiton absolument, je préfère les utiliser tout le temps parce que je suis susceptible de revenir et de le changer à un moment donné, ce qui est quand je vais bousiller si je ne les ai pas mis là en premier lieu. Au moins les mettre sur une ligne différente - j'espère que nous pouvons être d'accord là-dessus :) –

+0

Je n'utilise jamais d'accolades pour une seule déclaration, et je reviens souvent et j'y ajoute plus, et je n'ai jamais oublié d'ajouter des accolades et foiré mon flux de contrôle ... A moins que j'aie écrit du python pendant un moment et que je revienne ensuite à C, c'est-à-dire. –

3

while (r == false)

devrait être

while (! R)

Malgré ce que tout le monde a dit au sujet de la virgule, c'est-ce que je pense est mal avec elle :)

+1

'while (r == false)' est plus explicite et lisible. Je suppose que les gens pourraient aussi argumenter que ça devrait être 'while (false == r)', mais je déteste ça. De toute façon, ce n'est pas qu'il devrait "changer" à '! R' parce que' r' est un booléen donc ça ne sera pas important, ce qui veut dire que c'est juste une question de style. –

+0

Suivre systématiquement la convention 'r' et'!r' au lieu de 'r == false' et' r == true' évite l'erreur de 'r = false' et' r = true' (ce qui ne causera pas une erreur de compilation dans java). Renommez 'r' pour quelque chose comme' continue' ou 'found' si vous voulez le rendre plus explicite et lisible. – ILMTitan

+1

continue est un mot-clé qui ferait un nom de variable terrible. Vous avez raison, cependant, des choses comme r et s sont de terribles noms de variables. Utilisez un IDE moderne avec auto-complétion et appelez-le quelque chose de sensé, comme fait ou trouvé. – ajs410

3

+1 à Daniel DiPaolo. Je pensais que je posterais une réponse séparée pour fournir une clarification de pourquoi c'est le cas.

Les boucles Java peuvent être écrites de deux manières différentes. S'il y a une seule ligne au corps de la boucle, vous pouvez les écrire de façon sténographie:

while (true) 
    System.out.println("While loop"); 

Cette imprimera « While » sur la console jusqu'à ce que le programme se termine. L'autre option est de spécifier un corps de boucle entre accolades, comme vous l'avez fait ci-dessus:

int i = 0; 
while (i < 10) { 
    System.out.println("i = " + i); 
    i++; 
} 

Cette imprimera "i = 0", "i = 1", ..., "i = 9" chacun sur une ligne séparée.

Ce que le code que vous avez posté est confondre les deux. Dans la boucle while short, l'analyseur Java s'attend à trouver une déclaration entre la condition de boucle while et le point-virgule. Parce qu'il ne trouve pas de déclaration ici, la boucle while s'exécute, mais ne fait rien; il n'a pas de corps. De plus, comme la boucle n'a pas de corps, votre variable r n'a aucune possibilité d'assumer une nouvelle valeur; la condition est toujours évaluée à true et la boucle ne se ferme jamais.

Si vous deviez annuler la condition dans la boucle while dans votre exemple, c.-à-

boolean r = false ; int s = 0 ; 
while (r != false) ; 
{ 
    s = getInt() ; 
    if (!(s>=0 && s<=2)) System.out.println ("try again not a valid response") ; 
    else r = true ; 
} 

(notez que j'ai quitté le point-virgule erroné là), vous constaterez que votre corps en boucle destiné exécuterait précisément une fois, car la boucle ne serait jamais exécutée.

3

En plus d'autres commentaires, vous devez également modifier le cas pour

if (s < 0 || s > 2) 

Il est ainsi beaucoup plus compréhensible.

+0

+1 Absolument, la négation fait que c'est une corvée de lire quelque chose qui devrait être simple. –

1

Une réponse sans rapport, je vous recommande vraiment de suivre les directives de style de Sun.

boolean r = false ; 
int s = 0 ; 
while (r == false) { 
    s = getInt() ; 
    if (!(s>=0 && s<=2)) { 
     System.out.println ("try again not a valid response") ; 
    } else { 
     r = true ; 
    } 
} 

Vous pouvez vous débarrasser de la variable r et if/else condition si vous évaluer le résultat dans la boucle elle-même.

int s = 0; 

while((s = getInt()) < 0 || s > 2) { 
    System.out.println("Try again, not a valid response"); 
}