Boucle do while

Résolu/Fermé
Zellian Messages postés 3 Date d'inscription dimanche 19 juillet 2020 Statut Membre Dernière intervention 21 juillet 2020 - 19 juil. 2020 à 16:55
Zellian Messages postés 3 Date d'inscription dimanche 19 juillet 2020 Statut Membre Dernière intervention 21 juillet 2020 - 21 juil. 2020 à 10:32
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 :

	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

KX Messages postés 16737 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 18 mai 2024 3 015
19 juil. 2020 à 17:30
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
0
Zellian Messages postés 3 Date d'inscription dimanche 19 juillet 2020 Statut Membre Dernière intervention 21 juillet 2020
20 juil. 2020 à 14:47
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
0
KX Messages postés 16737 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 18 mai 2024 3 015 > Zellian Messages postés 3 Date d'inscription dimanche 19 juillet 2020 Statut Membre Dernière intervention 21 juillet 2020
20 juil. 2020 à 16:56
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 donne
Java : ISO-8859-1
et
Scanner : 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 exemple
Scanner sc = new Scanner(System.in, "UTF-8");
0
Zellian Messages postés 3 Date d'inscription dimanche 19 juillet 2020 Statut Membre Dernière intervention 21 juillet 2020 > KX Messages postés 16737 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 18 mai 2024
Modifié le 21 juil. 2020 à 11:10
C'est exact j'obtiens bien :

Java : UTF-16
Scanner : UTF-16


J'avais modifié cette option pour pouvoir utiliser des accents dans les variables.

Après modifications même la partie
charAt(0) 
pour les caractères fonctionne.

Merci beaucoup pour tes explications.
0