Partage
  • Partager sur Facebook
  • Partager sur Twitter

gérer les exceptions

    25 mai 2011 à 22:22:49

    Bonsoir,
    J'essaie de gérer des erreurs de saisie: si ce n'est pas un entier et si c'est en dehors du tableau. Je n'est pas d'erreur à la compilation mais j'ai quand même 2 erreurs:
    quand je saisie une lettre, il m'affiche
    2Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Unknown Source)
    at java.util.Scanner.next(Unknown Source)
    at java.util.Scanner.nextInt(Unknown Source)
    at java.util.Scanner.nextInt(Unknown Source)
    at Menu.choix(Menu.java:21)
    at Menu.main(Menu.java:44)
    et quand je saisie un chiffre en dehors du tableau, il me redemande bien de ressaisir mais si je fais une saisie correct, il me demande encore de ressaisir, je ne sors plus de mon do.
    Si quelqu'un à une idée....Merci


    import java.io.*; 
    import java.util.Scanner;
    public class Menu {
    	Scanner sc = new Scanner(System.in); 
    	String[]rubriques;
    	Menu(String[]tabRubriques){		// constructeur 
    		this.rubriques=tabRubriques;
            }
            private void afficher(){  
        	    System.out.println("Saisir les rubriques = ");
        	    String []tabRubriques=new String[7]; 	// rubriques dans le tabRubriques
        	    for(int i=0; i<tabRubriques.length;i++){	
        	    	    tabRubriques[i]=sc.nextLine();	//j'ecris les rubriques
            }
          	  for(int i=0; i<tabRubriques.length;i++){	// afficher tabRubriques  avec l'indice commençant à 1
                System.out.println((i+1) +"- " +  tabRubriques[i]);
              }
            }
            private int choix()throws PasNbre,HorsTableau {
        	   System.out.println("Entrer votre choix = ");
        	   int choix=sc.nextInt();
        	   //sc.nextLine(); /* pour nettoyer l'entrée */
        	   String conv= "" + choix; //je convertie en string
        	   char ck=conv.charAt(0); 
        	   boolean rep=Character.isDigit(ck); //si c'est un chiffre,true
        	   if(!rep)
        	    	throw new PasNbre(); //c 'est pas un chiffre
        	   if ( choix<1 || choix>this.rubriques.length )
        	    	throw new HorsTableau();   	     	 
        	    return choix;   
        	} 
        	
    class PasNbre extends Exception{}
    class HorsTableau extends Exception{}
    
        public static void main(String[] args){
        	  	Scanner sc = new Scanner(System.in);
            	String []tabRubriques=new String[7];
            	Menu menuRubriques= new Menu(tabRubriques);
            	boolean bonChoix=true;
            	menuRubriques.afficher();
            	do{
            		try{
    				menuRubriques.choix();
    			}
    			catch(PasNbre e){
    				System.out.println("Vous n'avez pas saisi un nombre");
    				System.out.println("Recommencez !");
    				bonChoix=false;
    			}
    			catch(HorsTableau e){
    				Terminal.ecrireStringln("Votre choix doit être compris entre 1 et 7");
    				Terminal.ecrireStringln("Recommencez,");
    				bonChoix=false;
    			}
    		}
    		while(!bonChoix);
    		Terminal.ecrireString("test boucle OK");
    	}
    }
    
    • Partager sur Facebook
    • Partager sur Twitter
      26 mai 2011 à 13:56:39

      Salut,

      Tout d'abord, il y a un gros problème : les méthodes de ta classe Menu ont un accesseur "private" et tu les utilises de façon "public"...

      De plus, tu as deux Scanner qui vont vers 'System.in'. Un te suffit largement :)

      Finalement, je ne comprends pas vraiment comment tu gères tes exceptions... Elles sont toutes les deux gérées à deux endroits différents... J'ai du mal à comprendre ton code...

      Je pense que tu as voulu composer ton code en plusieurs classes (et c'est bien), mais tu ne t'y es pas pris de la bonne façon...

      Je pense que qqch de ce style serait mieux :

      class Menu
      {
          String[] rubriques;
      
          Menu(String[] tabRubriques){		
              this.rubriques = tabRubriques;
          }
      
          public void afficher(){  
              System.out.println("Saisir les rubriques = ");
      
              for(int i = 0; i < tabRubriques.length; i++){
                  System.out.println(tabRubriques[i]);
              }
      
              for(int i = 0; i < tabRubriques.length; i++){	// afficher tabRubriques  avec l'indice commençant à 1
                  System.out.println((i+1) +"- " +  tabRubriques[i]);
              }
          }
      
          public int choix(int choix){
              String conv= "" + choix; //je convertis en string
          	char ck=conv.charAt(0); 
          	boolean rep=Character.isDigit(ck); //si c'est un chiffre, true
              
              /** TU GERES ICI TES EXCEPTIONS */ 
           
              return choix;
          }
      }
      
      class Main{
          public static void main(String[] args){
      
          Scanner sc = new Scanner(System.in);
          String []tabRubriques=new String[7];
          Menu menuRubriques= new Menu(tabRubriques);
          boolean bonChoix=true;
      
          do{
             menuRubriques.afficher();
             menuRubriques.choix(sc.nextInt());
          }while(!bonChoix);
          
          Terminal.ecrireString("test boucle OK");
      }
      
      • Partager sur Facebook
      • Partager sur Twitter
      Lorsque l'on fait une recherche google, on tombe sur des forums qui nous disent de chercher sur google...
        26 mai 2011 à 14:10:28

        inutile d'essayer de convertir ton nextInt() en string. Regarde l'API Java pour connaitre les exception levées par cette méthode. JE pense que tu y trouvera ce que tu cherches.

        Si tu veut bloquer la saisie au dessus d'une valeur maximale (si j'ai bien compris ton problème de tableau) , alors il te suffit de tester la valeur de ton nextInt. Si il est supérieur a ta valeur tolérée, tu redemandes une saisie.
        • Partager sur Facebook
        • Partager sur Twitter

        gérer les exceptions

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown