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

avec Java Discussion :

tableau de type double qui ne veut pas de double


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Par défaut tableau de type double qui ne veut pas de double
    Bonjour,


    Lorsque je rentre des prix à virgule (450.5 par exemple) le code ci-dessous me renvoie une erreur

    Prix de l'article 1:
    234.0
    Exception in thread "main" java.util.InputMismatchException
    at java.util.Scanner.throwFor(Unknown Source)
    at java.util.Scanner.next(Unknown Source)
    at java.util.Scanner.nextDouble(Unknown Source)
    at Shopinette.créerTabPrix(Shopinette.java:140)
    at Shopinette.reduire2(Shopinette.java:119)
    at Shopinette.main(Shopinette.java:15)

    Pourquoi?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //DEBUT CREER TABLEAU PRIX
    		public static double[] créerTabPrix(int nb) {	
    		Scanner sc = new Scanner(System.in);
    		double prix[]= new double[nb];
    		for (int i=0;i<nb;i++) {
    			System.out.println("Prix de l'article "+(i+1)+": ");
    			prix [i] = sc.nextDouble();
    		}
    		return prix;	
    		}
    //FIN CREER TABLEAU PRIX

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Tu saisis tes doubles avec un . pour la virgule. Or le Scanner est localisé, c'est-à-dire qu'il utilise un système qui va s'adapter à la langue de l'utilisateur, qui par défaut pour toi est le français, donc avec des nombres à virgule avec le signe "," et non ".". On peut également forcer la locale du Scanner pour utiliser une locale US par exemple (avec la méthode useLocale(locale)), ce qui te permettra de saisir tes doubles avec un . pour séparateur décimal.

    Autre chose : un Scanner est bufferisé. En résumé, quand tu tapes des touches au clavier, elles sont stockées dans un tampon (parce qu'aucun programme ne traite rien au même rythme qu'un humain qui tape au clavier). Ensuite, le Scanner lui aussi, pour des raisons pratiques, peut lire des caractères d'avance, ou pas, depuis le "buffer du clavier".

    La méthode nextDouble() lit tous les caractères se trouvant en attente dans le buffer tels qu'ils constituent un double. Il peut rester d'autres caractères en attente dans le buffer, parce qu'ils ne font pas partie d'un double.

    En particulier, quand tu saisis des nombres tu vas taper la touche entrée, ou une virgule, une espace, etc... pour séparer chacun des nombres. Ces touches produisent des caractères qui remplissent le buffer.

    Si tu fais deux nextDouble() de suite (explicitement ou dans une boucle), si tu as bien saisi deux nombres, par exemple, en tapant la touche entrée entre les deux, le second appel de nextDouble va essayer le lire le "\n" en attente dans le buffer comme si ça faisait partie d'un double, ce qui n'est pas le cas, d'où erreur.

    Pour éviter le problème, appelle nextLine() après le nextDouble() pour vider le buffer jusqu'à le prochain "\n". Ça c'est pour la solution simple rapide, mais...

    ...en réalité, il faudrait systématiquement tester ce qui se trouve en attente dans le buffer avant de le lire (hasNextDouble() par exemple pour tester s'il y a bien un double), et de réagir en fonction (sauter ce qui n'est pas double, informer l'utilisateur que sa saisie n'est pas un nombre, lui redemander éventuellement de saisir, faire de la correction de saisie à la volée, etc).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2014
    Messages : 13
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Autre chose : un Scanner est bufferisé. En résumé, quand tu tapes des touches au clavier, elles sont stockées dans un tampon (parce qu'aucun programme ne traite rien au même rythme qu'un humain qui tape au clavier). Ensuite, le Scanner lui aussi, pour des raisons pratiques, peut lire des caractères d'avance, ou pas, depuis le "buffer du clavier".

    La méthode nextDouble() lit tous les caractères se trouvant en attente dans le buffer tels qu'ils constituent un double. Il peut rester d'autres caractères en attente dans le buffer, parce qu'ils ne font pas partie d'un double.

    ...


    Pour éviter le problème, appelle nextLine() après le nextDouble() pour vider le buffer jusqu'à le prochain "\n". Ça c'est pour la solution simple rapide, mais...

    ...en réalité, il faudrait systématiquement tester ce qui se trouve en attente dans le buffer avant de le lire (hasNextDouble() par exemple pour tester s'il y a bien un double), et de réagir en fonction (sauter ce qui n'est pas double, informer l'utilisateur que sa saisie n'est pas un nombre, lui redemander éventuellement de saisir, faire de la correction de saisie à la volée, etc).
    Oui, j'ai déjà eu ces cas d'erreur et je pensais faire des tests systématiques.

    Merci!

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/08/2010, 17h50
  2. [JScrollPane] qui ne veut pas se mettre en haut a gauche
    Par Cyber@l dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 24/11/2006, 10h41
  3. requetes qui ne veut pas passer
    Par suya95 dans le forum Requêtes
    Réponses: 14
    Dernier message: 04/07/2006, 14h17
  4. JOptionPane qui ne veut pas se fermer!
    Par benthebest dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 29/12/2005, 22h05
  5. un fichier qui ne veut pas être supprimé!!!!
    Par en_stage dans le forum Autres Logiciels
    Réponses: 4
    Dernier message: 22/10/2005, 01h08

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