Instance de la classe Scanner non vide

Résolu/Fermé
nicosan92 Messages postés 11 Date d'inscription mercredi 31 juillet 2013 Statut Membre Dernière intervention 19 août 2013 - 31 juil. 2013 à 18:38
nicosan92 Messages postés 11 Date d'inscription mercredi 31 juillet 2013 Statut Membre Dernière intervention 19 août 2013 - 1 août 2013 à 00:23
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

A voir également:

1 réponse

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
31 juil. 2013 à 23:34
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");
}
0
nicosan92 Messages postés 11 Date d'inscription mercredi 31 juillet 2013 Statut Membre Dernière intervention 19 août 2013
1 août 2013 à 00:23
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.
0