Partage
  • Partager sur Facebook
  • Partager sur Twitter

Gerer plusieurs exceptions

    19 décembre 2014 à 14:34:29

    Bonjour,

    Je suis dans la partie Exceptions du cours apprenez à programmer en java et un doute m'assaille.

    Je n'ai aucune erreur dans mes classes dans Eclipse et pourtant le programme s'arrête quand je le lance dans la console. Est-ce normal ?

    Voici le code de mes classes.

    Ville.java

    public class Ville {
    	  //Variables publiques qui comptent les instances
    	  public static int nbreInstances = 0;
    	  //Variable privée qui comptera aussi les instances
    	  protected static int nbreInstancesBis = 0;
    	  //Stocke le nom de notre ville
    	  protected String nomVille;
    	  //Stocke le nom du pays de notre ville
    	  protected String nomPays;
    	  //Stocke le nombre d'habitants de notre ville
    	  protected int nbreHabitants;
    	  protected char categorie;
    	  
    	  //Constructeur par défaut
    	  public Ville(){
    		//On incrémente nos variables à chaque appel aux constructeurs
    		nbreInstances++;
    		nbreInstancesBis++; 
    	    System.out.println("Création d'une ville !");      
    	    nomVille = "Inconnu";
    	    nomPays = "Inconnu";
    	    nbreHabitants = 0;
    	    this.setCategorie();
    	  }
    	  
    	//Constructeur avec paramètres
    	  //J'ai ajouté un « p » en première lettre des paramètres.
    	  //Ce n'est pas une convention, mais ça peut être un bon moyen de les repérer.
    	  public Ville(String pNom, int pNbre, String pPays)
    			  throws  NombreHabitantException, NomVilleException
      {  
        if(pNbre < 0)
          throw new NombreHabitantException(pNbre);
        
        if(pNom.length() < 3)
          throw new NomVilleException("Le nom de la ville est inferieur à 3 caractères ! nom = "+pNom);
        else
        {
    		//On incrémente nos variables à chaque appel aux constructeurs
    		nbreInstances++;
    		nbreInstancesBis++; 
    	    System.out.println("Création d'une ville avec des paramètres !");
    	    nomVille = pNom;
    	    nomPays = pPays;
    	    nbreHabitants = pNbre;
    	    this.setCategorie();
    	  }
      }

    Capitale.java

    public class Capitale extends Ville {
    	 private String monument;
    	 
    	  //Constructeur par défaut
    	  public Capitale(){
    	    //Ce mot clé appelle le constructeur de la classe mère  
    	    super();
    	    monument = "aucun";
    	  }
    	  
    	//Constructeur d'initialisation de capitale
    	  public Capitale(String nom, int hab, String pays, String monument)
    	  throws  NombreHabitantException, NomVilleException
    	  {
    		  super(nom, hab, pays);
    		  this.monument = monument;
    		  if(hab < 0)
    			  throw new NombreHabitantException(hab);
        
    		  if(nom.length() < 3)
    			  throw new NomVilleException("Le nom de la ville est inferieur à 3 caractères ! nom = "+nom);
    		  else
    		  {
    			  
    		  }
        
    	  }
    	  
    	  public String decrisToi(){
    		 String str =  super.decrisToi() + "\n \t ==>>" + this.monument+ " en est un monument";
    		    
    		 return str;
    	  }
    	  public String toString(){
    		  String str = super.toString() + "\n \t ==>>" + this.monument + " en est un monument";
    		  return str;
    		  }
    	  /**
    	    * @return le nom du monument
    	  */
    	  public String getMonument() {
    	    return monument;
    	  } 
    	  //Définit le nom du monument
    	  public void setMonument(String monument) {
    	    this.monument = monument;
    	  }   
    }

    NombreHabitantException.java

    class NombreHabitantException extends Exception{
    	public NombreHabitantException(int nbre) {
    		System.out.println("Instanciation avec un nombre d'habitants négatif.");
    		System.out.println("\t => " + nbre);
    		}
    
    }

    NomVilleException.java

    public class NomVilleException extends Exception {
    	public NomVilleException(String message) {
    		super(message);
    	}
    
    }

    et enfin mon "main"

    Sdz1.java

    public class Sdz1 {
    
    	public static void main(String[] args) {
    		//Définition d'un tableau de villes null
    		Ville[] tableau = new Ville[6];
    		        
    		//Définition d'un tableau de noms de Villes et un autre de nombres d'habitants
    		String[] tab = {"Marseille", "lille", "ca", "lyon", "paris", "nantes"};
    		int[] tab2 = {123456, 78456, 654987, 75832165, 1594, 213};
    		         
    		//Les trois premiers éléments du tableau seront des Villes
    		//et le reste des capitales
    		Ville v = null;
    		Capitale c = null;
    		for(int i = 0; i < 6; i++){
    		  if (i <3){
    			  try {
    		    v = new Ville(tab[i], tab2[i], "france");
    		    tableau[i] = v;
    			  } catch (NombreHabitantException | NomVilleException e2) {
    				  System.out.println(e2.getMessage());
    			  }
    			  finally {
    				  if (v == null)
    					  v = new Ville();
    			  }
    		  }
    		         
    		  else{
    			  try {
    		    c = new Capitale(tab[i], tab2[i], "france", "la tour Eiffel");
    		    tableau[i] = c;
    			  } catch (NombreHabitantException | NomVilleException e2) {
    				  System.out.println(e2.getMessage());
    			  }
    			  finally {
    				  if (c == null)
    					  c = new Capitale();
    			  }
    		  }
    		}
    		                 
    		//Il ne nous reste plus qu'à décrire tout notre tableau !
    		for(Object obj : tableau){
    		  System.out.println(obj.toString()+"\n");
    		}
    	}
    }

    Le code de la class Ville est dans le cours j'ai donc adapté le code  de la Class Capitale et modifié le code de la class Sdz1





    • Partager sur Facebook
    • Partager sur Twitter
    Jean-Luc D.
      19 décembre 2014 à 14:36:46

      Et voici le resultat:

      Création d'une ville avec des paramètres !
      Création d'une ville avec des paramètres !
      Le nom de la ville est inferieur à 3 caractères ! nom = ca
      Création d'une ville avec des paramètres !
      Création d'une ville avec des paramètres !
      Création d'une ville avec des paramètres !
          Marseille est une ville de france, elle comporte : 123456 habitant(s) => elle est donc de catégorie : D

          lille est une ville de france, elle comporte : 78456 habitant(s) => elle est donc de catégorie : C

      Exception in thread "main" java.lang.NullPointerException
          at Sdz1.main(Sdz1.java:46)

      • Partager sur Facebook
      • Partager sur Twitter
      Jean-Luc D.
        19 décembre 2014 à 14:57:12

        essayer ca :

        for(Object obj : tableau){
              if(obj != null){
                  System.out.println(obj.toString()+"\n");
              }
        }

        code défensif

        • Partager sur Facebook
        • Partager sur Twitter
          19 décembre 2014 à 15:02:55

          Quelle est la ligne 46 de la classe Sdz1?

          -
          Edité par max-om-93 19 décembre 2014 à 15:13:53

          • Partager sur Facebook
          • Partager sur Twitter
            19 décembre 2014 à 15:07:59

            C'est une erreur, c'est la ligne 45 qui est en cause.

            System.out.println(obj.toString()+"\n");



            • Partager sur Facebook
            • Partager sur Twitter
            Jean-Luc D.
              19 décembre 2014 à 15:08:45

              obj est null. A toi de t'arranger pour qu'il ne le soit plus.
              • Partager sur Facebook
              • Partager sur Twitter
                19 décembre 2014 à 15:10:44

                Quand il n'y a pas d'erreur le code fonctionne parfaitement bien, dans l'exemple, j'ai mis une erreur sur le nombre de lettres d'une ville pour tester la gestion des exceptions

                • Partager sur Facebook
                • Partager sur Twitter
                Jean-Luc D.
                  19 décembre 2014 à 15:14:45

                  Quand tu as une exception, tu n'ajoutes pas de ville dans ton tableau, ton tableau comporte du coup moins de 6 éléments. Tu dois donc vérifier que obj n'est pas nul avant de faire ton System.out.println(obj)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    19 décembre 2014 à 15:28:23

                    ok je vais essayer de faire ça, merci.
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Jean-Luc D.
                      19 décembre 2014 à 15:50:10

                      Voila le nouveau code, et la nouvelle réponse

                      public class Sdz1 {
                      
                      	public static void main(String[] args) {
                      		//Définition d'un tableau de villes null
                      		Ville[] tableau = new Ville[6];
                      		        
                      		//Définition d'un tableau de noms de Villes et un autre de nombres d'habitants
                      		String[] tab = {"Marseille", "lille", "ca", "lyon", "paris", "nantes"};
                      		int[] tab2 = {123456, 78456, 654987, 75832165, 1594, 213};
                      		         
                      		//Les trois premiers éléments du tableau seront des Villes
                      		//et le reste des capitales
                      		Ville v = null;
                      		Capitale c = null;
                      		for(int i = 0; i < 6; i++){
                      		  if (i <3){
                      			  try {
                      		    v = new Ville(tab[i], tab2[i], "france");
                      		    tableau[i] = v;
                      			  } catch (NombreHabitantException | NomVilleException e2) {
                      				  System.out.println(e2.getMessage());
                      			  }
                      			  finally {
                      				  if (v == null)
                      					  v = new Ville();
                      			  }
                      		  }
                      		         
                      		  else{
                      			  try {
                      		    c = new Capitale(tab[i], tab2[i], "france", "la tour Eiffel");
                      		    tableau[i] = c;
                      			  } catch (NombreHabitantException | NomVilleException e2) {
                      				  System.out.println(e2.getMessage());
                      			  }
                      			  finally {
                      				  if (c == null)
                      					  c = new Capitale();
                      			  }
                      		  }
                      		}
                      		                 
                      		//Il ne nous reste plus qu'à décrire tout notre tableau !
                      		for(Object obj : tableau){
                      			if (obj == null)
                      				obj = new Object();
                      		  System.out.println(obj.toString()+"\n");
                      		}
                      	}
                      }


                      Création d'une ville avec des paramètres !
                      Création d'une ville avec des paramètres !
                      Le nom de la ville est inferieur à 3 caractères ! nom = ca
                      Création d'une ville avec des paramètres !
                      Création d'une ville avec des paramètres !
                      Création d'une ville avec des paramètres !
                          Marseille est une ville de france, elle comporte : 123456 habitant(s) => elle est donc de catégorie : D

                          lille est une ville de france, elle comporte : 78456 habitant(s) => elle est donc de catégorie : C

                      java.lang.Object@15db9742

                          lyon est une ville de france, elle comporte : 75832165 habitant(s) => elle est donc de catégorie : H
                            ==>>la tour Eiffel en est un monument

                          paris est une ville de france, elle comporte : 1594 habitant(s) => elle est donc de catégorie : B
                            ==>>la tour Eiffel en est un monument

                          nantes est une ville de france, elle comporte : 213 habitant(s) => elle est donc de catégorie : A
                            ==>>la tour Eiffel en est un monument

                      Apparemment le code continue de s'executer c'est super, mais serait il possible de mettre l explication prévue, à la place du code erreur ?

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Jean-Luc D.
                        19 décembre 2014 à 16:50:14

                        Code erreur ?? tu veux dire "java.lang.Object@15db9742" ce n'est pas un code d'erreur, c'est le résultat de la fonction toString() d'un objet de type Object.

                        -Ton Tableau comporte toujours 6 éléments pas moins pas plus.

                        -Si tu utilise System.out.println(obj), ta pas besoin de faire un test de nullité sur ton objet, la fonction System.out.println le fait pour toi

                        Après si tu fait System.out.println(obj) la fonction va appeler automatiquement le toString de ton objet obj si la Class de ton objet n’implémente pas la fonction toString elle va appeler le toString de sa class mère et ainsi de suite ....

                        Tu affiche déja l explication prévue tu veux la (re)afficher .... ?

                        -
                        Edité par NoneNone1 19 décembre 2014 à 16:51:21

                        • Partager sur Facebook
                        • Partager sur Twitter
                          19 décembre 2014 à 17:21:03

                          pardon pour le "code erreur"

                          en fait ce que je voulais, c'est que le code continue malgré une exception.

                          Ça apparemment c'est ok, et ensuite est il possible d'éliminer les lignes

                          "Création d'une ville avec paramètres."

                          Merci encore

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Jean-Luc D.
                            19 décembre 2014 à 17:37:24

                            Il faut virer la ligne : 

                            System.out.println("Création d'une ville avec des paramètres !")
                            • Partager sur Facebook
                            • Partager sur Twitter
                              19 décembre 2014 à 18:49:52

                              Oups !! oui Merci c'est ça que je ne retrouvais pas.
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Jean-Luc D.
                                19 décembre 2014 à 18:55:22

                                Par contre si je ne fais pas le test de nullité j'obtiens le resultat suivant

                                Instanciation avec un nombre d'habitants négatif.
                                     => -78456
                                null
                                    Marseille est une ville de france, elle comporte : 123456 habitant(s) => elle est donc de catégorie : D

                                Exception in thread "main" java.lang.NullPointerException
                                    at Sdz1.main(Sdz1.java:47)

                                Et le programme s'arrête

                                • Partager sur Facebook
                                • Partager sur Twitter
                                Jean-Luc D.
                                  19 décembre 2014 à 19:06:07

                                  Oui mais faut pas mettre :

                                  System.out.println(obj.toString()+"\n");

                                  essaye juste :

                                  System.out.println(obj);

                                  en plus les deux lignes que tu as ajouté :

                                  if (obj == null)
                                                  obj = new Object();

                                  pour moi ce n'est pas une solution, tu le fait juste pour évite l'exception alors ....

                                  alors que un truc comme ça:

                                  if(obj != null) {
                                      Sysem.out.println(obj);
                                      // ou obj.xX j'invoque une methode (dans ton exemple obj.toString())
                                  }else {
                                      // je fait quoi quand un element de mon tableau est null ??
                                      // je ne peux pas invoquer de method sur obj "un object null"
                                  }





                                  PS : si tu utilise println ta pas besoin d'ajouter le "\n" println le fe automatiquement,

                                  -
                                  Edité par NoneNone1 19 décembre 2014 à 19:07:05

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    19 décembre 2014 à 19:38:13

                                    NoneNone1 a écrit:

                                    Oui mais faut pas mettre :

                                    System.out.println(obj.toString()+"\n");

                                    essaye juste :

                                    System.out.println(obj);
                                    System.out.println() va automatiquement appeler la méthode toString() de l'objet passé en paramètre. Le résultat est donc le même. (Hormis pour le "\n")

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      19 décembre 2014 à 19:51:16

                                      max-om-93 a écrit:

                                      NoneNone1 a écrit:

                                      Oui mais faut pas mettre :

                                      System.out.println(obj.toString()+"\n");

                                      essaye juste :

                                      System.out.println(obj);

                                      System.out.println() va automatiquement appeler la méthode toString() de l'objet passé en paramètre. Le résultat est donc le même. (Hormis pour le "\n")

                                      oui automatiquement si obj n'est pas null 

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        20 décembre 2014 à 9:47:34

                                        Merci à vous pour ces explications.

                                        @ NoneNone1 : J'ai bien pris tes explications en compte. Il est évident qu'il faut faire quelque chose pour réparer l'erreur, mais ici je suis dans le cours, j'essaye d'abord de comprendre le fonctionnement. Ta dernière méthode me va beaucoup mieux en termes de résultat, je garde ça sous le coude. Merci encore

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Jean-Luc D.

                                        Gerer plusieurs 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