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 :

A propos de la Classe Scanner


Sujet :

Langage Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2014
    Messages : 39
    Points : 33
    Points
    33
    Par défaut A propos de la Classe Scanner
    Bonjour à tous,

    Tout d'abord, étant nouveau sur ce forum, j'espère me trouver dans la bonne catégorie.

    Ma question comporte la classe Scanner. Je souhaite faire interagir l'utilisateur dans un programme à différentes reprises et différents endroits de mon programme. Pour cela je crée une "public static", où je crée un objet de la classe Scanner, je l'utilise puis le ferme.

    Le problème est qu'à la seconde utilisation, j'obtiens un message d'erreur que je n'explique pas...

    Voici un exemple simple où le phénomène se produit :
    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
     
    import java.util.Scanner;
     
    public class Essai {
     
    	public static String foo () {
    		Scanner reader = new Scanner(System.in);
    		String answer = reader.next();
    		reader.close();
    		return answer;
    	}
     
    	public static void main(String[] args) {		
    		for (int i = 0; i < 2; i++) {
    			System.out.println(foo());
    		}
    	}
    }
    Voici les erreurs retournées par la JVM :
    Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Scanner.java:838)
    at java.util.Scanner.next(Scanner.java:1347)
    at Language.Essai.foo(Essai.java:9)
    at Language.Essai.main(Essai.java:16)
    Quelqu'un a t il une explication de ce phénomène ?

    Merci d'avance pour vos réponse, et merci pour le temps pris pour la lecture de ce post.

  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
    Cela ferme à la fois le scanner mais aussi la source associée (ici System.in) quand elle implémente l'interface Closeable. D'où ici la levée d'exception

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Exception in thread "main" java.util.NoSuchElementException
    pour résoudre le problème, tu peux faire par exemple:


    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 Essai {
     
    	static Scanner reader = new Scanner(System.in);
     
    	public  static String foo () {
     
    		return  reader.next();
    	}
     
    	public static void main(String[] args) {
     
    		for (int i = 0; i < 2; i++) {
    			System.out.println(Essai.foo());
    		}
     
    		reader.close();	
    	}
    }

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2014
    Messages : 39
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par plawyx Voir le message
    Cela ferme à la fois le scanner mais aussi la source associée (ici System.in) quand elle implémente l'interface Closeable. D'où ici la levée d'exception

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Exception in thread "main" java.util.NoSuchElementException
    Merci pour ta réponse. Merci aussi pour ton code qui règle ici le problème.

    Cependant, ce que je ne comprends pas, c'est que, ok, reader.close() ferme le scanner reader, ainsi que la source associée (system.in). Mais, lorsque l'on demande de rouvrir un scanner par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    reader = new Scanner(System.in)
    ne réouvre t-on pas la source associée ? Ce serait de la même veine que de fermer la source associée, non ?

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 565
    Points : 21 630
    Points
    21 630
    Par défaut
    La plupart du temps "rouvrir" un flux ne veut rien dire. Le principe de le fermer, c'est qu'il est fermé et c'est fini.

    Pour beaucoup de flux, il est possible d'en créer un autre : créer un nouveau flux de lecture de fichier, créer une nouvelle socket, etc. Mais pour l'entrée standard, les programmes n'en ont qu'une. Pour en créer une autre, il faut démarrer un nouveau programme.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2014
    Messages : 39
    Points : 33
    Points
    33
    Par défaut
    Moralité, si je comprends bien, dans un code où l'on interagit avec l'utilisateur dans différentes classes et méthodes, il vaut mieux déclarer l'outil
    dans le main, puis le passer en argument aux différentes méthodes l'utilisant, et le fermer dans le main.

    Par contre, si l'on déclare
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Scanner reader = new Scanner(file.txt)
    , reader peut être ouvert, puis fermé, puis réouvert, puis refermé, etc. Je sais que ça à l'air bête dit comme ça..., mais je pense être dans une situation qui peut avoir besoin de cela (tout dépend des choix de l'utilisateur..., s'il est C**...!!!)

    Merci pour vos réponses précieuses !!!!

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 565
    Points : 21 630
    Points
    21 630
    Par défaut
    C'est ça. À la limite, celui sur System.in t'es pas obligé de le fermer. Après tout, tu as pas ouvert System.in, c'est le démarrage Java qui s'en charge, lui-même basé sur l'OS.

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

Discussions similaires

  1. Utilisation de la classe Scanner sous Eclipse
    Par cadabricadabra dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 24/02/2008, 11h30
  2. Utilisation de la classe Scanner
    Par habasque dans le forum Langage
    Réponses: 4
    Dernier message: 26/01/2007, 15h38
  3. Utilisation de la classe Scanner sous Eclipse
    Par cadabricadabra dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 04/10/2006, 15h48
  4. A propos de la classe ThreadLocal
    Par santana2006 dans le forum Langage
    Réponses: 5
    Dernier message: 25/07/2006, 19h27
  5. Limites de la classe Scanner
    Par WuKoDLaK dans le forum Langage
    Réponses: 4
    Dernier message: 17/07/2006, 16h18

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