Partage
  • Partager sur Facebook
  • Partager sur Twitter

les exceptions

Sujet résolu
    24 janvier 2009 à 14:03:53

    plzz j'ai un petit probleme dans la gestion des exceptions.
    je reprend l'exemple traite sur ce site ville,capitale..
    voila mon code :
    public class Ville {
    	//les variables d'instance :
    	protected String nomVille;
    	protected String nomPays;
    	protected int nbrHabitant;
    	protected char categorie;
    	public static int nbrInstance=0;
    	protected static int nbrInstanceBis=0;
    	
    	//constructeurs :
    	
    	Ville(){
    		try
    		{
    this("inconnu",0,"inconnu"); ?????erreur : Constructor call must be the first statement in a constructor
    		}
    		catch(NombreHabitantException e){}
    		this.setCategorie();
    		nbrInstance++;
                    nbrInstanceBis++;
    	}
    	
    	Ville(String v,int nbr,String p)throws  NombreHabitantException
    	{
            if(nbr < 0)
                throw new NombreHabitantException();
            else
        	{
    			this.nomVille=v;
    			this.nomPays=p;
    			this.nbrHabitant=nbr;
    			this.setCategorie();
    			nbrInstance++;
    			nbrInstanceBis++;
    		}
    	}
    

    et la classe NombreHabitantException :
    public class NombreHabitantException extends Exception{
    	public NombreHabitantException(){
    				System.out.println("Vous essayez d'instancier une classe Ville avec un nombre d'habitants négatif !");
    				}
    
    }
    

    le probleme est dans le constructeur par defaut :
    ici : this("inconnu",0,"inconnu");
    j'essaye d'appeller le constructeur avec argument pour éviter de répéter l'initialisation
    svp aidez moi
    • Partager sur Facebook
    • Partager sur Twitter
      24 janvier 2009 à 15:11:10

      ca semble un peu n'importe quoi ce que tu fais... (le prend pas mal, c'est un constat ;) )
      Tu appelles un constructeur d'une classe A dans un constructeur d'une classe A.

      moi comprends pas l'intérêt et le compilateur n'as pas l'air d'aimer.

      Je n'ai pas compris clairement ton problème par ailleur.
      • Partager sur Facebook
      • Partager sur Twitter
        24 janvier 2009 à 15:14:34

        Citation : Alanis

        Tu appelles un constructeur d'une classe A dans un constructeur d'une classe A.


        Oui mais pas le meme.

        Citation :

        moi comprends pas l'intérêt et le compilateur n'as pas l'air d'aimer.


        Le problème n'est pas là.
        l'intéret c'est d'éviter de dupliquer du code pour rien.

        ------
        this() ou super(), si il est utilisé, doit être la première chose qui se trouve dans ton constructeur, donc pas de try {}.

        Cependant il y a quelque d'incohérent dans ton code : pourquoi dans Ville(String v,int nbr,String p) tu laisse le soin à l'utilisateur de la classe de gérer l'exception alors que tu la gère toi-meme dans Ville() ?
        Tu pourrais te contenter de la relancer :
        Ville() throws NombreHabitantException {
        	this("inconnu",0,"inconnu"); 
        }
        
        • Partager sur Facebook
        • Partager sur Twitter
          24 janvier 2009 à 15:37:07

          Essaye de mieux indenter ton code, et de mieux utiliser la portée de tes variables et fonctions :
          protected sur une variable c'est toujours moche : mets les en private et écrit des accesseurs
          pense à déclarer tes constructeurs public
          • Partager sur Facebook
          • Partager sur Twitter
            24 janvier 2009 à 18:44:16

            merci de me repondre
            pardonnez moi je vais bien expliquer mon probleme
            voila mon code qui marche tres bien :
            classe ville :
            public class Ville {
            	//les variables d'instance :
            	protected String nomVille;
            	protected String nomPays;
            	protected int nbrHabitant;
            	protected char categorie;
            	public static int nbrInstance=0;
            	protected static int nbrInstanceBis=0;
            	
            	//constructeurs :
            	
            	Ville(){
            		this("inconnu",0,"inconnu");
            		nbrInstance++;
                    nbrInstanceBis++;
            	}
            	
            	Ville(String ville,int nbr_habitants,String pays)
            	{
            			this.nomVille=ville;
            			this.nomPays=pays;
            			this.nbrHabitant=nbr_habitants;
            			this.setCategorie();
            			nbrInstance++;
            			nbrInstanceBis++;
            		
            	}
            ...
            

            dans le constructeur par defaut j'ai appeler celui avec arguments pour ne pas repeter les memes instructions...
            alors j'ai essaye de gérer les exceptions(exemple d'après ce site)
            j'ai creer une classe :
            public class NombreHabitantException extends Exception{
            	public NombreHabitantException(){
            	super("Vous essayez d'instancier une classe Ville avec un nombre d'habitants négatif !");
                    }
            }
            

            alors je dois modifier le constructeur avec arguments de la classe ville :
            Ville(String ville,int nbr_habitants,String pays)throws  NombreHabitantException
            	{
                    if(nbr_habitants < 0)
                        throw new NombreHabitantException();
                    else
                	{
            			this.nomVille=ville;
            			this.nomPays=pays;
            			this.nbrHabitant=nbr_habitants;
            			this.setCategorie();
            			nbrInstance++;
            			nbrInstanceBis++;
            		}
            	}
            

            alors le probleme c'est que le compilateur me signale une erreur dans le constructeur par defaut qui fait appel au constructeur avec argument :
            Ville(){
            		<barre>this("inconnu",0,"inconnu");</barre><attention>erreur !!</attention>
            		nbrInstance++;
                    nbrInstanceBis++;
            	}
            

            alors d'apres freecircus j'ai fais :
            Ville() throws NombreHabitantException{
            		this("inconnu",0,"inconnu");
            		nbrInstance++;
                    nbrInstanceBis++;
            	}
            

            et ca marcge
            merci
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              24 janvier 2009 à 19:26:48

              Citation : Alanis

              ca semble un peu n'importe quoi ce que tu fais... (le prend pas mal, c'est un constat ;) )
              Tu appelles un constructeur d'une classe A dans un constructeur d'une classe A.



              ca semble un peu n'importe quoi ce que tu dis... (le prend pas mal, c'est un constat ;) )

              Appeler un constructeur depuis un autre est une pratique recommandée afin de factoriser le code.
              public MyClass() {
                  super();
              }
              
              public MyClass(int value) {
                  MyClass();
                  this.number = value;
              }
              
              public MyClass(int value, String myString) {
                  MyClass(value);
                  this.message = myString;
              }
              


              Dans son cas ça se passe mal étant donné que l'appel du constructeur doit être fait en tout premier, donc à moins d'avoir des constantes à passer en paramètre ne fonctionne pas.

              Donc avant de rabrouer les débutants, il faut apprendre soi même.
              • Partager sur Facebook
              • Partager sur Twitter
                24 janvier 2009 à 20:08:06

                Je ne connaissais pas cette technique, je suis content de l'avoir découvert. Je pensais ma réponse légitime, sans savoir que j'avais faux.

                Dommage que ton grand air et ta moquerie gratuite vienne casser ton explications.
                • Partager sur Facebook
                • Partager sur Twitter
                  31 janvier 2009 à 9:48:52

                  content pour toi Alanis ;)
                  • Partager sur Facebook
                  • Partager sur Twitter

                  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