1
votes

J'obtiens "erreur: impossible de trouver le symbole" en essayant de faire le chaînage du constructeur

C'est donc la partie de mon code qui contient les constructeurs. Comme vous pouvez le voir, le but est que les constructeurs prennent moins de paramètres et appellent les constructeurs les plus spécifiques. Je pensais avoir initié mes valeurs dans le premier constructeur. Pourquoi ne trouve-t-il pas mon symbole?

Voici mon code:

Frog.java:12: error: cannot find symbol
 this(Name, Age, TongueSpeed, IsFrogLet, Species);
            ^
  symbol:   variable Age
  location: class Frog
Frog.java:12: error: cannot find symbol
 this(Name, Age, TongueSpeed, IsFrogLet, Species);
                 ^
  symbol:   variable TongueSpeed
  location: class Frog
Frog.java:12: error: cannot find symbol
 this(Name, Age, TongueSpeed, IsFrogLet, Species);
                              ^
  symbol:   variable IsFrogLet
  location: class Frog
Frog.java:12: error: cannot find symbol
 this(Name, Age, TongueSpeed, IsFrogLet, Species);
                                         ^
  symbol:   variable Species
  location: class Frog
Frog.java:19: error: cannot find symbol
   this(Name, Age, TongueSpeed, IsFrogLet, Species);
              ^
  symbol:   variable Age
  location: class Frog
Frog.java:19: error: cannot find symbol
   this(Name, Age, TongueSpeed, IsFrogLet, Species);
                                ^
  symbol:   variable IsFrogLet
  location: class Frog
Frog.java:19: error: cannot find symbol
   this(Name, Age, TongueSpeed, IsFrogLet, Species);
                                           ^
  symbol:   variable Species
  location: class Frog
Frog.java:28: error: cannot find symbol
   this.age = Age;
              ^
  symbol:   variable Age
  location: class Frog

-C'est mon erreur que j'obtiens:

 public class Frog{

// instance variables 
 private String name;
 private int  age;
 private double tongueSpeed;
 private boolean isFrogLet;
 private  String species;

**// Third constructor** 
public Frog( String Name){
 this(Name, Age, TongueSpeed, IsFrogLet, Species);
 
 }


**//second constructor** 
 public Frog(String Name, int ageInYears, double TongueSpeed){
   this(Name, Age, TongueSpeed, IsFrogLet, Species);
   name= Name;
   age = ageInYears;
   tongueSpeed= TongueSpeed;
 }

**// most specific constructor**
 public Frog( String Name, int age, double TongueSpeed, boolean IsFrogLet, String Species){
   name = Name;
   this.age = Age;
   tongueSpeed = TongueSpeed;
   isFrogLet= IsFrogLet;
   species = Species;
 }

public void grow(int months){
 age = age + months;
 while ( age < 12){
  tongueSpeed++;
 }
 if (age>5 & age>30){
  double highRes= age-30;
  tongueSpeed= tongueSpeed-highRes;
 }
 if (age>1 & age <7){
  isFrogLet = true;
 }
}

}


1 commentaires

Vous devez suivre les conventions de dénomination Java: les noms de variables et les noms de méthodes doivent être écrits dans camelCase.


3 Réponses :


3
votes

Je pense que vous vous trompez sur le concept de surcharge du constructeur. ** // Le troisième constructeur ** ne prend que le nom, mais vous essayez toujours de transmettre d'autres éléments à this . Vous ne pouvez pas transmettre des choses si elles n'existent pas. Passez donc ce qui vient des paramètres et définissez les autres éléments sur null comme ceci:

public Frog( String Name){
   this(Name, 0, 0.0, false, null));
}

La même chose s'applique aux autres constructeurs. Voyez quels sont les paramètres des constructeurs concrets et définissez d'autres éléments sur null .


3 commentaires

comment passer null pour les types de données primitifs ( int , boolean et double )?


Vous avez raison. J'aurais dû passer plus de temps à examiner le code. J'ai modifié ma réponse.


je suis content d'avoir été utile :)



1
votes

l'erreur est explicite. Vous ne créez pas de variables avec les noms spécifiques dans votre deuxième et troisième constructeur avant de les transmettre au constructeur le plus spécifique.
Vous devez transmettre la variable exacte que vous recevez dans votre constructeur au constructeur sous-jacent ou vous devez transmettre certaines valeurs par défaut au constructeur le plus spécifique au lieu de ces variables (aka symboles).
vous devez donc appeler vos deuxième et troisième constructeurs de la manière suivante:

// Third constructor
public Frog(String Name) {
    this(Name, 0, 0.0, false, "");
}


//second constructor
public Frog(String Name, int ageInYears, double TongueSpeed) {
    this(Name, ageInYears, TongueSpeed, false, "");
}  

J'espère que cela vous aidera


0 commentaires

0
votes

Cause de l'erreur

Vous utilisez les variables non existantes car votre instance-niveau est dans camelCase no in title Les variables de cas autres que celle-ci, veuillez trouver du code refactorisé et essayez d'utiliser camelCase pour la variable

public class Frog {
    private String name;
    private int age;
    private double tongueSpeed;
    private boolean isFrogLet;
    private String species;

    public Frog(String name, int age, double tongueSpeed, boolean isFrogLet, String species) {
        this.name = name;
        this.age = age;
        this.tongueSpeed = tongueSpeed;
        this.isFrogLet = isFrogLet;
        this.species = species;
    }

    public Frog(String name) {
        this.name = name;
    }

    public Frog(String name, int ageInYears, double TongueSpeed) {
        this.name = name;
        this.age = ageInYears;
        this.tongueSpeed = TongueSpeed;
    }

    public void grow(int months) {
        age = age + months;
        while (age < 12) {
            tongueSpeed++;
        }
        if (age > 5 & age > 30) {
            double highRes = age - 30;
            tongueSpeed = tongueSpeed - highRes;
        }
        if (age > 1 & age < 7) {
            isFrogLet = true;
        }
    }

}

0 commentaires