Boucle do while
Résolu
Zellian
Messages postés
3
Statut
Membre
-
Zellian Messages postés 3 Statut Membre -
Zellian Messages postés 3 Statut Membre -
Bonjour,
Je me suis remis à JAVA récemment et j'ai un problème avec des boucles DO .. WHILE dès qu'il y a un scanner dedans :
Voici un exemple simplifié de mon problème avec un System.out AVANT et APRES pour bien voir ce qu'il se passe :
Voici ce que j'obtiens dans la console :
D'où ma question :
Pourquoi partant de isMatch = false [initialisation] , puis je passe par le Scanner isMatch = true (choix = oui) [lecture Scanner] et la seconde fois isMatch = false ( choix = oui )
Je me suis remis à JAVA récemment et j'ai un problème avec des boucles DO .. WHILE dès qu'il y a un scanner dedans :
Voici un exemple simplifié de mon problème avec un System.out AVANT et APRES pour bien voir ce qu'il se passe :
public static void main(String[] args) {
// TODO Auto-generated method stub
String choix = new String() ;
Boolean isMatch = true;
Scanner sc = new Scanner(System.in);
do {
System.out.println("AVANT choix = " + choix+ " isMatch = "+choix.equals("oui") );
System.out.print("Voulez-vous continuer ? oui / non :" );
choix = sc.nextLine();
isMatch = choix.equals( "oui" );
System.out.println("APRES choix = " + choix+ " isMatch = "+choix.equals("oui") );
sc.nextLine();
} while (isMatch == true) ;
System.out.print("Fin");
sc.close();
}
}
Voici ce que j'obtiens dans la console :
AVANT choix = isMatch = false
Voulez-vous continuer ? oui / non :oui
APRES choix = oui isMatch = true
AVANT choix = oui isMatch = true
Voulez-vous continuer ? oui / non :oui
APRES choix = oui isMatch = false
D'où ma question :
Pourquoi partant de isMatch = false [initialisation] , puis je passe par le Scanner isMatch = true (choix = oui) [lecture Scanner] et la seconde fois isMatch = false ( choix = oui )
Configuration: Windows / Chrome 83.0.4103.116
1 réponse
-
Bonjour,
En testant ton code j'ai bien le résultat souhaité, pas ton bug :
AVANT choix = isMatch = false
Voulez-vous continuer ? oui / non :oui
APRES choix = oui isMatch = true
AVANT choix = oui isMatch = true
Voulez-vous continuer ? oui / non :oui
APRES choix = oui isMatch = true
AVANT choix = oui isMatch = true
Voulez-vous continuer ? oui / non :non
APRES choix = non isMatch = false
Fin
Si vraiment tu as un problème tu peux afficher les différents octets du String choix, il est par exemple possible qu'il y ait un espace qui se promène.System.out.println(Arrays.toString(choix.getBytes())); // import java.util.Arrays;
Remarque : il y a plusieurs "maladresses" dans ton code, voici une version corrigée :public static void main(String[] args) { Scanner sc = new Scanner(System.in); String choix; do { System.out.print("Voulez-vous continuer ? oui / non : "); choix = sc.nextLine(); System.out.println("choix=" + choix + Arrays.toString(choix.getBytes())); } while (choix.equals("oui")); System.out.print("Fin"); }
Résultat :Voulez-vous continuer ? oui / non : oui
choix=oui[111, 117, 105]
Voulez-vous continuer ? oui / non : oui
choix=oui[111, 117, 105]
Voulez-vous continuer ? oui / non : non
choix=non[110, 111, 110]
Fin-
Tout d'abord merci pour la réponse.
Voici ce que j'obtiens avec la version corrigée :
Voulez-vous continuer ? oui / non : oui
choix=oui[-2, -1, 0, 111, 0, 117, 0, 105]
Voulez-vous continuer ? oui / non : oui
choix=oui[-2, -1, -2, -1, -2, -1, 0, 111, 0, 117, 0, 105]
Fin- Cela ressemble à un problème d'encodage. Tu peux contrôler les charset par défaut en faisant :
System.out.println("Java : " + Charset.defaultCharset()); System.out.println("Scanner : " + new InputStreamReader(System.in).getEncoding());
Chez moi, cela donneJava : ISO-8859-1
etScanner : ISO8859_1
ce qui correspond à du Latin-1
A priori les valeurs chez toi devraient être différentes (je pense que ce sera UTF-16), mais tu peux forcer le Scanner pour avoir un autre charset, par exempleScanner sc = new Scanner(System.in, "UTF-8");
-