IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Problème avec le Scanner


Sujet :

Langage Java

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2021
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2021
    Messages : 41
    Points : 48
    Points
    48
    Par défaut Problème avec le Scanner
    Bonjour à tous !

    J'avais fait appel à vous pour un problème avec une Liste, maintenant que ce problème est résolu, le nouveau est lié à l'utilisation d'un Scanner.

    Je définissais une méthode ajoutInventaire dans la class Personnage, qui ajoute un Objet o dans la LinkedList inventaire. Voulant brider la taille de l'inventaire à 10 places, je rajoute une condition : si inventaire.size() > 10, alors on propose à l'utilisateur de choisir entre garder les objets de son inventaire, ou en changer un pour prendre celui trouvé. Pour cela, on demande à l'utilisateur de répondre oui s'il souhaite échanger un objet contre celui trouvé, ou non s'il ne le souhaite pas (bon, j'ai pas encore fais le cas où l'utilisateur rentre n'importe quoi, mais chaque chose en son temps).

    Je teste donc la méthode, en remplissant l'inventaire (qui se remplit correctement), jusqu'à arriver à 10 objets en son sein. A ce moment-là, un problème s'impose, je vous mets donc la méthode ajoutInventaire, ainsi que l'erreur en question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    public void ajoutInventaire(Obj o) {
    	if(inventaire.size() < 10) {
    		inventaire.add(o);
    		System.out.println("Objet "+o.getNom()+" ajouté à l'inventaire");
    	} else {
    		System.out.println();
    		System.out.println("Inventaire plein, remplacer un item possédé par "+o.getNom()+" ?");
     
    		System.out.print("Repondre oui ou non : ");
    		Scanner choixLacherObjet = new Scanner(System.in);
    		String choixJoueur = choixLacherObjet.nextLine();
    		if(choixJoueur == "oui") {
    			for(Obj ob : inventaire) {
    				System.out.println(ob.getNom());
    			}
    			System.out.println("Quel objet souhaitez-vous laisser ?");
    			System.out.println("Remplacer quel objet par "+o.getNom());
    			Scanner choixLacherObjet1 = new Scanner(System.in);
    			String choix = choixLacherObjet1.nextLine();
    			choixLacherObjet1.close();
    			Obj objet = new Obj();
    			for(int i = 0 ; i < 10 ; i++) {
    				if(inventaire.get(i).getNom() == choix) {
    					objet = inventaire.get(i);
    				}
    			}
     
    			inventaire.remove(objet);
    			inventaire.add(o);
     
    		} else {
    			System.out.println("Vous laissez l'objet");
    		}
     
    		choixLacherObjet.close();		
    	}
    	System.out.println(inventaire);	
    }
    Et voici l'exécution de mon test lorsqu'un inventaire est plein :

    Inventaire plein, remplacer un item possédé par Claymore ?
    Repondre oui ou non : Exception in thread "main" java.util.NoSuchElementException: No line found
    at java.base/java.util.Scanner.nextLine(Scanner.java:1651)
    at testjeu/testjeu.Personnage.ajoutInventaire(Personnage.java:45)
    at testjeu/testjeu.Combat.main(Combat.java:168)
    Je précise que mon IDE ne m'indique aucune erreur et s'exécute normalement.

    J'espère vraiment que vous prendrez de nouveau le temps de m'aider, merci d'avance !

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 974
    Points : 1 825
    Points
    1 825
    Par défaut
    pour tester l'égalité de deux chaînes de caractères, ce n'est pas "==" mais la méthode "equals" (ou "equalsIgnoreCase") de la classe String:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    			if("oui".equals(choixJoueur))

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2021
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2021
    Messages : 41
    Points : 48
    Points
    48
    Par défaut
    D'accord, c'est bon à savoir, je pensais que ça fonctionnait avec une égalité simple :p Par contre, même après avoir corrigé ces erreurs le problème subsiste...

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Hello,

    je constate que tu crées un nouvel objet Scanner à l'intérieur de cette méthode, qui semble pourtant n'être qu'une petite méthode parmi tant d'autres. Et qu'en plus tu fermes ce Scanner à la fin de la méthode.

    Ce Scanner tu t'en sers sur System.in, l'entrée standard. Il n'y en a qu'une pour toute la durée de vie de ton programme, il ne faut donc la lire que d'une seule manière, avec un seul Scanner pour le programme entier. Le mieux est de créer un Scanner au début du programme et de te servir de cet unique Scanner partout où il y en a besoin.

    De même, si jamais tu t'avises de fermer un Scanner qui lit l'entrée standard, cela fermera l'entrée standard et donc ton programme ne pourra plus rien lire puisque le programme n'a plus d'entrée.

    Puisque ce n'est pas toi qui a ouvert System.in (il est ouvert par le système avant d'exécuter le programme), tu n'es pas vraiment responsable de le fermer (il sera fermé par le système quand le programme s'arrête).
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2021
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2021
    Messages : 41
    Points : 48
    Points
    48
    Par défaut
    Bonjour !

    Il faudrait donc simplement que je crée un unique Scanner en début de chaque class (ou alors un unique dans la class main et que je passe en entrée un scanner dans chaque méthode en nécessitant un) que je ne ferme pas ? Si c'est bien ça que je devrais faire, je pense savoir où était mon erreur : dans ma class main, j'avais une fonction creationPersonnage, qui utilisait 3 Scanner System.in que je fermais à la fin de la fonction !

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Un seul, pour tout le programme.

    Et oui, c'est à cause de la fermeture de Scanners sur System.in que tu as cette erreur.

    Mais ouvrir plusieurs Scanners sur le même flux peut conduire à des erreurs plus subtiles. Et surtout ça n'a pas de sens.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec Scanner.nextline
    Par Woufeigh dans le forum Langage
    Réponses: 2
    Dernier message: 20/03/2013, 15h26
  2. Problème avec java.util.Scanner
    Par fab56 dans le forum Eclipse Java
    Réponses: 6
    Dernier message: 16/09/2009, 21h25
  3. [FreeBSD] Problème avec le scanner
    Par michael_10 dans le forum BSD
    Réponses: 0
    Dernier message: 02/12/2007, 17h07
  4. Problème avec mon scanner Epson stylus 3200
    Par kanu27 dans le forum Périphériques
    Réponses: 1
    Dernier message: 30/11/2007, 19h48
  5. Problème avec Scanner
    Par sonorc dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 11/07/2007, 13h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo