Instance de la classe Scanner non vide [Résolu/Fermé]

Signaler
Messages postés
11
Date d'inscription
mercredi 31 juillet 2013
Statut
Membre
Dernière intervention
19 août 2013
-
Messages postés
11
Date d'inscription
mercredi 31 juillet 2013
Statut
Membre
Dernière intervention
19 août 2013
-
Bonjour et merci de prendre la peine de lire ce message,

Voilà, je suis en train de réaliser mon dernier programme dans le cadre de mes études et je suis confronté à un problème qui ne m'était jamais arrivé concernant la classe Scanner.

J'ai une fonction qui demande si l'utilisateur est un Moniteur ou un client. Je vérifie si l'utilisateur ne rentre pas n'importe quoi et je lui fait recommencer en cas d'erreur.

public int switchPersonType(){
	System.out.println("Bienvenue !\nQui êtes vous ?\n");
	int choix = null;
	Scanner scanner = new Scanner(System.in);
	System.out.println("     1.  Moniteur");
	System.out.println("     2.  Client");
	System.out.println("     0.  Quitter");
	System.out.print("\nChoix : ");
	do{
		if(choix!=-1) System.out.println("Veuillez entrer un choix valable\nChoix : ");
		while(!scanner.hasNextInt()){
			System.out.println("Veuillez entrer un chiffre");
			System.out.print("Choix : ");
			scanner.nextLine();
		}
		choix = scanner.nextInt();
	}while(choix<0 || choix>2);
	scanner.nextLine();
	scanner.close();
	return choix;
}


Cette fonction retourne donc un entier qui est réutilisé dans un switch qui me permettra de lancer les fonctionnalités de mon programme. Ce switch est situé dans un do while qui recommence le programme à zéro tant que l'utilisateur n'a pas montré son intention de le quitter.

do{
	menu.accueil();
	personType = menu.switchPersonType();
			
	switch(personType){
	case 1 :
		System.out.println("Vous êtes un moniteur.");
		break;
	case 2: 
		System.out.println("Vous êtes un Client.");
		break;
	case 0:
		menu.fermeture();
		break;
	default:
		System.out.println("Une erreur est survenue lors du choix du type de personne.");
		System.out.println("Refaites votre choix !\n\n");
		break;
	}
	outils.clear();
}while(personType!=0);


Le problème est le suivant : Dès que la fonction switchPersonType est appelée à nouveau, le Scanner est déjà rempli d'une valeur inconnue (que je n'ai pas trouvée dans le debugger). Toutefois, ce n'est pas un entier car la méthode hasNextInt renvoie false, mais le scanner.nextLine() génère une exception. Je soupçonne un "\0" que je n'aurais pas annulé à l'aide d'un nextLine.

Auriez-vous une idée d'où pourrait venir cette erreur ?

Merci à vous

1 réponse

Messages postés
16251
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 février 2021
2 797
System.in est un objet unique (puisque tu n'as qu'un clavier), il faut donc lui associer un unique objet Scanner. De plus tu as d'autres erreur, comme ton "int choix = null;" puisque choix est un int tu ne peux pas lui affecter une valeur null, celle-ci est réservée aux objets !

Voici comment on pourrait faire, en décomposant le traitement et ne manipuler le Scanner que sur une méthode dédiée "getInt" qui va gérer tous les cas possibles d'erreurs lors de la saisie utilisateur, ce qui rend plus simple l'utilisation de la méthode "switchPersonType" et des autres.

Exemple :

public static final Scanner scanner = new Scanner(System.in);

public static int getInt(String msg, int min, int max, String msgError)
{
    while (true)
    {
        System.out.print(msg);
        
        try
        {
            int n = Integer.parseInt(scanner.nextLine());
            
            if (n >= min && n <= max)
                return n;
        }
        catch (NumberFormatException e)
        {
        }
        
        System.out.print(msgError);
    }
}

public static int switchPersonType()
{
    System.out.println("Bienvenue !");
    System.out.println("Qui êtes vous ?");
    System.out.println();
    System.out.println("\t1.  Moniteur");
    System.out.println("\t2.  Client");
    System.out.println("\t0.  Quitter");
    
    return getInt("\nChoix : ", 0, 2, "Veuillez entrer un choix valable");
}
Messages postés
11
Date d'inscription
mercredi 31 juillet 2013
Statut
Membre
Dernière intervention
19 août 2013

Ah, c'est en effet une bonne idée. (Pour le null, j'avoue que je ne sais pas ce qui m'est passé par la tête).

Ce n'est pas vraiment mon habitude de programmer comme cela, mais je vais creuser un peu plus sur ce genre de méthodes qui, il est vrai, simplifie grandement la vie. Il faut également que je m'habitue à catcher les exceptions.

Merci beaucoup pour ta réponse. Je crois que ton aide m'apporte bien plus qu'une réponse à ma question. :)

À bientôt.