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

Java Discussion :

Cas spécifique d'une exception sur un Scanner


Sujet :

Java

  1. #1
    Candidat au Club
    Homme Profil pro
    apprenti
    Inscrit en
    Décembre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : apprenti

    Informations forums :
    Inscription : Décembre 2014
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Cas spécifique d'une exception sur un Scanner
    Hello,

    J'étais en train de montrer à des amis comment fonctionnaient les exceptions en java et je suis tombé sur un cas que je n'avais jamais traité auparavant. J'ai cherché de mon côté mais personne n'a su m'expliquer pourquoi cela fonctionnait ainsi (pas même mon enseignante).

    Ce cas spécifique est le suivant : Je dois saisir 2 entiers à tour de rôle, j'ai donc déclaré un scanner tout à fait classique et je fais 2 appels à la méthode nextInt(), jusque la rien de très fou.
    Afin de contrer une erreur de saisie (ex : chaîne de caractère, ..), j'ai entouré chaque appel a nextInt() avec un bloc try / catch affichant un message d'erreur et faisant éventuellement quelques traitements à côté.

    Cependant, si je provoque une exception lors du premier nextInt(), le message s'affiche, et au moment du second, je ne peux pas saisir et l'exception est levée directement !

    Je vous pose le code ci-dessous :

    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
    import java.util.Scanner;
     
    public class Test {
     
     
    	public static void main(String args[]){
     
    		Scanner sc = new Scanner(System.in);
    		Scanner sc2 = new Scanner(System.in);
    		int a,b;
     
    		System.out.println("Saisie du premier entier :");
    		try{a=sc.nextInt();}
    		catch(Exception e1){
    			System.out.println("Exception bloc 1");
    			//Traitement
    		}
     
    		System.out.println("Saisie du second entier :");
    		try{b=sc.nextInt();}
    		catch(Exception e2){
    			System.out.println("Exception bloc 2");
    			//Traitement
    		}
     
    	}
    }

    Afin de comprendre, lancez le programme et essayez de taper par exemple "azert" lors de la première série, l'exception s'affichera, suivie de l'affichage demandant la saisie du second et finalement le 2e bloc d'exception !

    J'imagine que ça doit être lié au Scanner qui déclenche l'erreur mais j'aimerais bien comprendre le fonctionnement de tout ça !

    PS : Je sais que le code est dégueulasse et qu'il faut faire une fonction pour chaque saisie par exemple, mais ce n'est pas le problème, je souhaite juste comprendre ce détail

    Merci d'avance pour ceux qui auront une petite réponse à donner

    Bonne soirée

  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,

    Un Scanner utilise un tampon. Tout d'abord, la saisie n'est bloquant que quand le tampon est vide. Lorsqu'on appelle nextInt(), on demande au scanner de regarder s'il y a de quoi produire un int dans le tampon. Si c'est le cas, ce qui est nécessaire à la production de cet int est consommé. Les séparateurs (espace par défaut) sont automatiquement ignorés. Mais si le tampon ne contient pas de quoi produire un int, une exception est levée, mais le tampon n'est pas vidé pour autant : reste alors le tampon la saisie en cours. Qui provoque à nouveau une exception lors de l'appel du nextInt() suivant.

    Essaye d'ajouter juste ce que j'ai surligné en jaune :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    System.out.println("Saisie du premier entier :");
    		try{a=sc.nextInt();}
    		catch(Exception e1){
    			System.out.println("Exception bloc 1");
    			//Traitement
    		}
     
    System.out.println(sc.nextLine());
    
    System.out.println("Saisie du second entier :");
    Tu verras que ta saisie ("azert") sera affichée dans la console : c'est bien la saisie qui est restée dans le tampon, parce que le nextInt() ne la pas consommée.

    Il vaut mieux avec scanner utiliser la méthode hasNextInt() par ailleurs, plutôt que de laisser l'exception se soulever, ce qui permet plus facilement de contrôler la saisie (boucle pour redemander la bonne saisie). Ce qui ne dispense pas de vider le tampon au besoin).
    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.

Discussions similaires

  1. Generer une exception sur un socket TCP en C
    Par LastSpear dans le forum Réseau
    Réponses: 7
    Dernier message: 19/03/2014, 18h02
  2. SqlAlchemy : lever une exception sur erreur d'encodage
    Par Sekigo dans le forum Général Python
    Réponses: 8
    Dernier message: 31/03/2013, 16h29
  3. Créer une exception sur un dossier en local uniquement
    Par nicolas.pied dans le forum Apache
    Réponses: 1
    Dernier message: 19/02/2008, 18h24
  4. Recupération d'une exception sur Job Talend
    Par tioneb369 dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 18/10/2007, 10h05
  5. Réponses: 5
    Dernier message: 07/07/2005, 10h20

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