"bug" Scanner

Signaler
-
Messages postés
15929
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
4 juillet 2020
-
Bonjour, j'ai essayer de programmer un logiciel qui créer automatiquement des fonctions qui calculent le nombre x en Java pour mon année de 3 ème. Dans la boucle while, les sc.nextLine et sc.nextInt ne fonctionnent pas, s'il vous plaît aidez moiiiii T^T
le code:
import java.util.*;
class Main {
public static void main(String[] args) {
int f =1;
Scanner sc = new Scanner(System.in);
System.out.print("Veuillez choisir la valeur de x. ");
int x = sc.nextInt();
System.out.print("Veuillez choisir le nombre de tour que vous voulez faire. ");

int t = sc.nextInt();
while(f!=t){
System.out.print("Vous êtes au tour "+f+" Veuillez entrer un option(multiplier, diviser, ajouter, soustraire) ");
String calc = sc.nextLine();
if (calc==("multiplier")){
System.out.print("Vous êtes au tour "+f+". Veuillez choisir le nombre qui permettra de "+calc+" y à x ");
int nb = sc.nextInt();
x = (x*nb);
}
if (calc==("diviser")){
System.out.print("Vous êtes au tour "+f+". Veuillez choisir le nombre qui permettra de "+calc+" y à x ");
int nb = sc.nextInt();
if (nb == 0){
System.out.print("erreur, vous ne pouvez pas diviser un nombre par 0.");
}
else{
x = (x/nb);
}
}


if (calc==("ajouter")){
System.out.print("Vous êtes au tour "+f+". Veuillez choisir le nombre qui permettra de "+calc+" y à x ");
int nb = sc.nextInt();
x = (x+nb);
}
if (calc==("soustraire")){
System.out.print("Vous êtes au tour "+f+". Veuillez choisir le nombre qui permettra de "+calc+" y à x ");
int nb = sc.nextInt();
x = (x-nb);
}
System.out.print(x);
f+=1;

}
}
}


EDIT : Ajout des balises de code

Cordialement, un développeur débutant.
Configuration: Linux / Firefox 77.0

1 réponse

Messages postés
15929
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
4 juillet 2020
2 629
Bonjour,

Le problème c'est qu'ici Scanner est utilisé avec le clavier. Or quand tu saisis un nombre pour valider tu appuis également sur la touche Entrée.
Mais nextInt ne lit que le nombre, pas la touche Entrée, donc une fois le nombre lu il reste encore la touche Entrée à lire.
Lorsque le programme arrive sur nextLine il lit la touche Entrée qui restait, au lieu de lire la ligne que tu voulais.

Le plus simple pour résoudre ton problème, c'est de faire suivre chaque nextInt d'un nextLine dont le seul but sera de récupérer la touche Entrée.
int t = sc.nextInt(); sc.nextLine();


Remarque :
calc==("multiplier")
est faux, pour comparer la valeur de deux objets il faut utiliser la méthode equals :
calc.equals("multiplier")