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 :

Switch case et Scanner System.in


Sujet :

avec Java

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2023
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Octobre 2023
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Switch case et Scanner System.in
    Bonjour,
    Je tente de faire un menu avec un switch case et voici ce que j'obtiens, Pouvez-vous m'éclairer SVP ?
    Merci d'avance,

    *** Menu ***
    Pour effectuer une action, saisissez le choix correspondant :
    Ajouter un livre 1
    Afficher la Bibloth�que 2
    Quitter le programme 3
    1
    Veuillez saisir le Titre :
    la chute
    Veuillez saisir l'Auteur :
    camus
    Veuillez saisir l'Editeur :
    grasset

    *** Menu ***
    Pour effectuer une action, saisissez le choix correspondant :
    Ajouter un livre 1
    Afficher la Biblotheque 2
    Quitter le programme 3
    Exception in thread "main" java.util.NoSuchElementException
    at java.base/java.util.Scanner.throwFor(Scanner.java:945)
    at java.base/java.util.Scanner.next(Scanner.java:1486)
    at Test.main(Test.java:34)

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    import java.util.Scanner;
     
    public class Test {
     
    	public Test() {
    		// TODO Auto-generated constructor stub
    		super();
    	}
     
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
     
    		Bibliotheque bibli = new Bibliotheque();
    		Livre liv = new Livre(null, null, null);
    		Scanner sc = new Scanner(System.in);
    		boolean bool = true;
    		/*bibli.Ajouter(liv); 
     
    		bibli.Afficher();*/
     
    		// Demander au user les actions à réaliser
    		String menu = "*** Menu *** \n"+
    				"  Pour effectuer une action, saisissez le choix correspondant :  \n" +
    				"  Ajouter un livre		                                                     1\n"+
    				"  Afficher la Biblothèque                                                     2\n"+		
    				"  Quitter le programme                                                      3\n";
     
     
    		// Afficher choix user
    		while(bool){
    			System.out.print("\n" +menu);
     
    			// Action à réaliser
    			String choix = sc.next();			
     
    			try{
    				// Tests des choix
    				switch(choix){
    				case "1":
    					bibli.Ajouter(liv);
    					break;
    				case "2":
    					bibli.Afficher();
    					break;
    				case "3":
    					bool = false;
    					break;
     
    				default:
    					System.out.println("Veuillez saisir un choix valide ");
    					break;
    				}
    			}
    			catch(NumberFormatException e){
    				System.out.println("Ce n'est pas un nombre");
    			}
     
    		}
    				sc.close();
    	}
     
    }

  2. #2
    Modérateur

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

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

    le code montré ne semble pas avoir de problème de ce genre.

    Il semble que ce code fasse appel à d'autres classes : Bibliotheque, Livre.

    C'est probablement avec ces classes-là qu'un conflit se crée au global.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2023
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Octobre 2023
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci Thelvin, Voici mes 2 classes Bibliothèque et Livre, franchement je ne vois pas d'où vient le problème :


    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
    import java.util.InputMismatchException;
    import java.util.Scanner;
    public class Bibliotheque {
     
    	public Bibliotheque() {
    	}
     
    	Livre [] leslivres = new Livre[25];
    	int nb = 0;
     
    	public void Ajouter(Livre liv) {
     
    		try (Scanner sc = new Scanner(System.in)){	
    		    System.out.println("Veuillez saisir le Titre :");
    			liv = new Livre(null, null, null);
    			liv.setTitre(sc.nextLine());			
    			System.out.println("Veuillez saisir l'Auteur :");
    			liv.setAuteur(sc.nextLine());
    			System.out.println("Veuillez saisir l'Editeur :");
    			liv.setEditeur(sc.nextLine());
    		 } 
    			catch(InputMismatchException e){ 
    				System.out.println(e);			
    		    }
    		this.leslivres[this.nb] =liv;
    		this.nb++;
    	}	
    	public void Afficher() {
    		for (nb = 0; nb<leslivres.length; nb++) {
    			if (leslivres[nb] != null)			
    			System.out.println("Les livres sont :\n"+leslivres[nb].getTitre()+"\n"+leslivres[nb].getAuteur()+"\n"+leslivres[nb].getEditeur());
    		}			
    	}	
    }
    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
    public class Livre {
     
    	private String titre, auteur, editeur;
     
    	public Livre(String titre, String auteur, String editeur) {
    		this.titre = titre;
    		this.auteur = auteur;
    		this.editeur = editeur;
    	}
     
    	public String getTitre() {
    		return titre;
    	}
     
    	public void setTitre(String titre) {
    		this.titre = titre;
    	}
     
    	public String getAuteur() {
    		return auteur;
    	}
     
    	public void setAuteur(String auteur) {
    		this.auteur = auteur;
    	}
     
    	public String getEditeur() {
    		return editeur;
    	}
     
    	public void setEditeur(String editeur) {
    		this.editeur = editeur;
    	} 	
    }

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 554
    Points : 21 613
    Points
    21 613
    Par défaut
    Voilà. Donc le message d'erreur est causé par ceci dans la classe Bibliotheque :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    try (Scanner sc = new Scanner(System.in)){
    Pour rappel, cette syntaxe est le try-with-resource, dont l'unique but est d'être bien certain qu'on va fermer la ressource mentionnée.

    Ici on s'assure de bien fermer System.in

    Donc

    - le programme principal lit System.in pour connaître le choix dans le menu de l'utilisateur
    - le choix est d'ajouter un livre, appel de Ajouter()
    - Ajouter() lit les infos du livres en utilisant System.in, et en s'assurant qu'il sera bien fermé après
    - on a fini d'ajouter un livre, on retourne au menu
    - le programme essaie à nouveau d'utiiliser System.in pour connaître le choix dans le menu de l'utilisateur, ce qui est impossible puisqu'on s'est assuré de bien fermer System.in

    A première vue la solution c'est de ne pas s'occuper de fermer System.in. Après tout tu ne l'as pas ouvert, alors ça ne fait pas tellement sens de le fermer.

    Attention toutefois :

    • on n'est pas censé créer plus d'un Scanner sur le même flux, et notamment pas sur System.in. Ici tu fais new Scanner(System.in) à deux endroits différents, Test et Bibliotheque. C'est générateur de problèmes.
    • une solution à ça serait de créer un seul Scanner au tout début du programme, et de laisser toutes les classes qui en ont besoin, utiliser ce seul et unique Scanner créé.
    • par nature, next() et nextLine() ne vont pas bien ensemble, ça crée des résultats contre-intuitifs. Il vaut mieux choisir d'utiliser uniquement l'un ou uniquement l'autre. En l'occurrence, comme tu peux avoir besoin d'espaces dans le titre d'un livre ou le nom d'un auteur, il vaut mieux utiliser nextLine() uniquement et faire comme si next() n'existait pas.


    Honnêtement... Communiquer avec l'utilisateur dans la console, c'est bizarre et bien plus compliqué que ça ne devrait l'être quand on débute. Mais c'est comme ça, on fait avec ce qu'on a. Il y a peu d'effort pour rendre tout cela plus pratique, parce que quand on fait un vrai programme, il y a longtemps que la console n'est plus là.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. problème switch case
    Par fpaquin dans le forum Langage
    Réponses: 1
    Dernier message: 17/03/2011, 09h48
  2. Problème de boucle Switch Case
    Par mLk92 dans le forum Langage
    Réponses: 4
    Dernier message: 14/06/2007, 17h20
  3. Problème de switch-case ou de buffer ?
    Par Gilouou dans le forum C
    Réponses: 8
    Dernier message: 11/11/2006, 21h08
  4. Problème switch case
    Par Nelmo dans le forum MFC
    Réponses: 8
    Dernier message: 04/05/2006, 15h17
  5. [Tableaux] Problème avec Switch case
    Par philippef dans le forum Langage
    Réponses: 4
    Dernier message: 07/09/2005, 16h37

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