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 :

scanner.nextLine après scanner.nextInt


Sujet :

avec Java

  1. #1
    Membre actif Avatar de stracoma
    Homme Profil pro
    Médecin
    Inscrit en
    Août 2013
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Maroc

    Informations professionnelles :
    Activité : Médecin

    Informations forums :
    Inscription : Août 2013
    Messages : 413
    Points : 229
    Points
    229
    Par défaut scanner.nextLine après scanner.nextInt
    Bonjour à vous tous. Je débute en java et du premier jour je tombe sur un os.
    voilà mon code:
    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
    import java.util.Scanner;
    public class k25 {
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Scanner clavier= new Scanner(System.in);
     
    		System.out.println("entrer nombre");
    		int n= clavier.nextInt();
     
    		System.out.println("entrer nom");
    		String nom= clavier.nextLine();
     
    		System.out.println("entrer prenom");
    		String prenom= clavier.nextLine();
    	}
     
    }
    résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    entrer nombre
    25
    entrer nom
    entrer prenom
    stracoma
    le programme ne me cède pas la main pour écrire mon nom
    Merci
    J'apprends la programmation pour le plaisir

  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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    L'appel de nextInt() lit le prochain int qui se trouve dans le tampon (jusqu'au prochain délimiteur(une espace par défaut, ou la fin de la ligne), mais celui-ci n'est pas consommé (il sont juste ignorés si on fait un autre nextInt() sur la même ligne), mais quand tu as saisi l'entier, tu as tapé "entrée" après, qui lui est aussi dans le tampon. Il faut donc terminer de lire la ligne pour passer à une autre ligne, donc ajouter un nextLine(), avant de faire le nextLine() qui te sert à saisir le nom.
    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 confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 757
    Points : 572
    Points
    572
    Par défaut
    Bonjour bonsoir !

    Ton instance de Scanner, que tu as appelé clavier n'est jamais clôturée. Il faut faire un clavier.close() lorsque tu as fini de t'en servir.

    Le nom d'une classe doit toujours commencer par une lettre majuscule comme tu peux le voir dans le conventions de nommage (voir lien) énumérées ci-dessous par Monsieur Doudoux :
    91.3.4. Les conventions de nommage des entités

    Les conventions de nommage des entités permettent de rendre les programmes plus lisibles et plus faciles à comprendre. Ces conventions permettent notamment de déterminer rapidement quelle entité désigne un identifiant, une classe ou une méthode.

    Les classes, les interfaces et les constructeurs :
    La première lettre est en majuscule.
    Si le nom est composé de plusieurs mots, la première lettre de chaque mot doit être en majuscule, ne pas mettre de caractère underscore '_'
    Le nom d'une classe peut finir par impl pour la distinguer d'une interface qu'elle implémente.
    Les classes qui définissent des exceptions doivent finir par Exception.
    Ainsi ta classe k25 doit être transformée en K25 (avec un 'k' majuscule). Pour ce faire, si tu est sur Eclipse, tu sélectionne la classe (donc le mot k25), puis clic droit et refactor ou renamme ....
    OS : LinuxMint 20

  4. #4
    Membre expert

    Avatar de Songbird
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Juin 2015
    Messages
    493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2015
    Messages : 493
    Points : 3 872
    Points
    3 872
    Billets dans le blog
    8
    Par défaut
    Hello !

    Pour ma part j'ai une autre façon de faire pour récupérer des entrées clavier, que je trouve un peu moins embêtante. Je te laisse le morceau de code ci-dessous (qui est valide):

    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
    package fr.songird.buffer;
     
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    public class ReaderChar {
     
    	public static void main(String[] args){
    		BufferedReader lecteur = new BufferedReader(new InputStreamReader(System.in)); //Lecture du flux d'entrée en paramètre (l'entrée standard)
    		try{
    			String retourClavier = lecteur.readLine(); //pour une chaine de caractères;
     
    			System.out.println(retourClavier);
     
    			int retourClavierEntier = Integer.parseInt(lecteur.readLine()); //pour un entier
     
    			System.out.println(retourClavierEntier);
    		}catch(NumberFormatException exceptionInt){
    			exceptionInt.printStackTrace();
    		}catch(IOException exceptionIO){
    			exceptionIO.printStackTrace();
    		}finally{
    			lecteur.close();
    		}
     
    	}
     
    }
    Après, il te suffit de remettre le code dans un constructeur pour le réutiliser à volonté !

    Cordialement,

    Songbird.
    Avant de poster: FAQ Rust; FAQ Dart; FAQ Java; FAQ JavaFX.
    Vous souhaiteriez vous introduire au langage Rust ? C'est par ici ou ici !
    Une question à propos du langage ? N'hésitez pas à vous rendre sur le forum !


    Pour contribuer à la rubrique, vous pouvez me contacter par MP (Sorry, we're closed!) ou contacter directement la rédaction.

  5. #5
    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
    Citation Envoyé par francky74 Voir le message
    Ton instance de Scanner, que tu as appelé clavier n'est jamais clôturée. Il faut faire un clavier.close() lorsque tu as fini de t'en servir.
    Oui enfin, il faut, il faut... Ça peut pas faire de mal tout au plus.

    Il faut toujours fermer ce qu'on ouvre, et du coup c'est un bon réflexe, quand on crée un Scanner, de le fermer à la fin.
    Mais bon, System.in on l'a pas ouvert, et qui prend la peine de le fermer à chaque fois ? Dans ce cas, pourquoi faudrait-il fermer un Scanner sur lui ? En réalité ça n'a pas d'importance.

    Citation Envoyé par Songbird_ Voir le message
    Pour ma part j'ai une autre façon de faire pour récupérer des entrées clavier, que je trouve un peu moins embêtante. Je te laisse le morceau de code ci-dessous (qui est valide):
    Je me permets de résumer quand même que ça consiste à préférer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Integer.parseInt(lecteur.readLine())
    au lieu de

    Avec l'avantage néanmoins que la gestion des lignes est très claire, c'est vrai.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Je trouve ça doublement problématique :
    Citation Envoyé par Songbird_ Voir le message
    Après, il te suffit de remettre le code dans un constructeur pour le réutiliser à volonté !
    Déjà, c'est plutôt contraignant que l'instanciation d'une classe nécessite des entrées au clavier : il vaut mieux lire des valeurs au clavier d'une part (dans une méthode dédiée) et instancier la classe en passant des paramètres, ce qui permet d'instancier la classe avec des paramètres de n'importe quelle source (clavier, fichier, base de données, valeurs en dur dans le code, valeurs produites par des méthodes d'autres classes, etc.)

    Secondement, le fait de fermer en plus le flux System.in dans le constructeur (ce qui n'est pas utile (voir explication de @Thelvin ci-avant)), fait qu'on ne pourra plus lire quoique ce soit dans ce flux après instanciation de la classe, donc qu'on ne peut instancier qu'une seule instance de cette classe.
    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.

  7. #7
    Membre actif Avatar de stracoma
    Homme Profil pro
    Médecin
    Inscrit en
    Août 2013
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Maroc

    Informations professionnelles :
    Activité : Médecin

    Informations forums :
    Inscription : Août 2013
    Messages : 413
    Points : 229
    Points
    229
    Par défaut
    Bonsoir. Merci de votre aide.
    J'ai un peux compris le message de joel.drigo, pour les autres , c'est du chinois pour moi, car je viens à peine de commencer le Java (1 séance de 1 h).
    Mai j'ai finalement trouvé une explication détaillée ici

    Merci à vous
    J'apprends la programmation pour le plaisir

+ 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. [C#] Piloter un scanner
    Par freegreg dans le forum Windows Forms
    Réponses: 9
    Dernier message: 12/04/2005, 12h34
  3. Scanner un disque
    Par Gnux dans le forum Autres Logiciels
    Réponses: 5
    Dernier message: 14/12/2004, 18h58
  4. Scanner le poste de travail
    Par afan dans le forum MFC
    Réponses: 5
    Dernier message: 17/09/2004, 20h32
  5. Scanner des mails et récupérer le fichier attaché
    Par delphim dans le forum Composants VCL
    Réponses: 2
    Dernier message: 24/04/2003, 09h35

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