结果有问题

时间:2017-05-31 13:53:19

标签: java conditional eclipse-jee

你好吗?请这是我的Java代码,它可以工作,但这个词的类别不会出现在控制台中:

所以,我正在考虑这些行为,以便这种方法属于私有,但我想知道我是否在某个地方失败了

package packageSdz1;



// portée de la classe : public 
/* private :  méthode utilisée 
*que dans la classe où elle est mentionnée
public class Ville {
*/

public class Ville {


    // public sans ajout de portée

       //Les variables de classe : celles-ci sont communes à 
        //toutes les instances de votre classe.

    private String nomVille;
    private String nomPays;
    private int nbreHabitants;
    private char categorie;



    //Variables publiques qui comptent les instances
    public static int nbreInstances = 0;

      //Variable privée qui comptera aussi les instances
    private static int nbreInstancesBis = 0;   




    //Constructeur par défaut , es variables d'instance : ce sont elles 
    // qui définiront les caractéristiques de notre objet.
      public Ville(){

        System.out.println("Création d'une ville !");      
        nomVille = "Inconnu";
        nomPays = "Inconnu";
        nbreHabitants = 0;


        //On incrémente nos variables à chaque appel aux constructeurs
        nbreInstances++;
        nbreInstancesBis++;          
        //Le reste ne change pas.
      } 


          //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)
          {

            System.out.println("Création d'une ville avec des paramètres !");
            nomVille = pNom;
            nomPays = pPays;
            nbreHabitants = pNbre;



            nbreInstances++;
            nbreInstancesBis++;  
          }        




        //*************   ACCESSEURS *************


          public static int getNombreInstancesBis()
          {
            return nbreInstancesBis;
          }  
          //Le reste du code est le même qu'avant




          //Retourne le nom de la ville
          public String getNom()  {  
            return nomVille;
          }

          //Retourne le nom du pays
          public String getNomPays()
          {
            return nomPays;
          }

          // Retourne le nombre d'habitants
          public int getNombreHabitants()
          {
            return nbreHabitants;
          } 
          //Retourne la catégorie de la ville
              public char getCategorie()
              {
                return categorie;
              } 

          //*************   MUTATEURS   *************

          //Définit le nom de la ville
          public void setNom(String pNom)
          {
            nomVille = pNom;
          }

          //Définit le nom du pays
          public void setNomPays(String pPays)
          {
            nomPays = pPays;
          }

          //Définit le nombre d'habitants
          public void setNombreHabitants(int nbre)
          {
            nbreHabitants = nbre;
            this.setCategorie();
          }  


        //*******************************

          //Définit la catégorie de la ville
          private void setCategorie() {

            int bornesSuperieures[] = {0, 1000, 10000, 100000, 500000, 1000000, 5000000, 10000000};
            char categories[] = {'?', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'};

            int i = 0;
            while (i < bornesSuperieures.length && this.nbreHabitants > bornesSuperieures[i])
              i++;

            this.categorie = categories[i];
          }

          //Retourne la description de la ville
          public String decrisToi(){
            return "\t"+this.nomVille+" est une ville de "+this.nomPays+ ", elle comporte : "
                    +this.nbreHabitants+" habitant(s) => elle est donc de catégorie : "+this.categorie;
          }

          //Retourne une chaîne de caractères selon le résultat de la comparaison
          public String comparer(Ville v1){
            String str = new String();

            if (v1.getNombreHabitants() > this.nbreHabitants)
              str = v1.getNom()+" est une ville plus peuplée que "+this.nomVille;

            else
              str = this.nomVille+" est une ville plus peuplée que "+v1.getNom();
            return str;  


}
}

        Ville v = new Ville();
        Ville v1 = new Ville("Marseille", 123456, "France");       
        Ville v2 = new Ville("Rio", 321654, "Brésil");



            System.out.println("\n\n"+v1.decrisToi());
            System.out.println(v.decrisToi());
            System.out.println(v2.decrisToi()+"\n\n");
            System.out.println(v1.comparer(v2));

你知道为什么,类别不会出现在结果中吗?

Création d'une ville !
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 : 

2 个答案:

答案 0 :(得分:1)

你永远不会打电话给setCategorie()

尝试将构造函数调整为:

    public Ville(String pNom, int pNbre, String pPays) {

        System.out.println("Création d'une ville avec des paramètres !");
        nomVille = pNom;
        nomPays = pPays;
        nbreHabitants = pNbre;
        // Add this !!!
        setCategorie();

        nbreInstances++;
        nbreInstancesBis++;
    }

虽然更好的解决方案是没有categorie实例变量,因为它完全取决于nbreHabitants所以你可以更好地做到:

    //Retourne la catégorie de la ville
    public char getCategorie() {

        int bornesSuperieures[] = {0, 1000, 10000, 100000, 500000, 1000000, 5000000, 10000000};
        char categories[] = {'?', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'};

        int i = 0;
        while (i < bornesSuperieures.length && this.nbreHabitants > bornesSuperieures[i])
            i++;

         return categories[i];
    }

答案 1 :(得分:1)

您的问题在于您永远不会调用 setCategorie(),因此 categoriesie char永远不会被初始化。您可以在方法的构造函数中调用此方法,以确保在调用 decrisToi() categorie 具有值。

您还必须更改方法 setCategorie()中的while循环,如下所示,以确保 nbreHabitants 为0时 categories 仍然被初始化。确保在设置类别后增加 i

    while (i < bornesSuperieures.length && this.nbreHabitants >= bornesSuperieures[i])

作为未来的提示,请尝试使用标准格式的代码,以便更容易阅读!大多数IDE都可以非常轻松地为您完成此任务。