2017-04-16 3 views
1

J'essaye d'initialiser les champs d'instance de la classe Animal en utilisant les contrôles de validation fournis dans le constructeur. Cela semble fonctionner si j'entre la valeur correcte - par exemple tiger - en appelant le constructeur mais ne fonctionne pas si j'entre la même valeur après avoir entré une valeur incorrecte. Pour une raison quelconque, il ne semble pas sortir de la boucle while. J'utilise la composition pour tester si la valeur des champs a été entrée correctement.La validation d'entrée de constructeur utilisant la boucle while ne fonctionne pas

public class Animal { privé Type de chaîne;

public Animal(String type) { 
    enter code here 

     if ((type.equals("cheetah")) || (type.equals("tiger")) || (type.equals("Snake")) || (type.equals("lion"))) { 
      this.type = type; 
     } 
     else { 
      Scanner animaltype = new Scanner(System.in); 
      System.out.println("This animal has either left the jungle or is not present in the jungle. Please enter another value."); 
      type = animaltype.next(); 
      while ((!type.trim().equals("cheetah") || (!type.trim().equals("tiger")) || (!type.trim().equals("Snake")) || (!type.trim().equals("lion")))) 
        { 
       if (type.equals("kangaroo")) { 
        System.out.println("Kangaroos have left the jungle. Please enter another value"); 
        type = animaltype.next(); 
       } 
       else if ((!type.trim().equals("kangaroo")) || (!type.trim().equals("cheetah")) || (!type.trim().equals("tiger")) || (!type.trim().equals("Snake")) || (!type.trim().equals("lion"))) { 
        System.out.println("This animal is not present in the Jungle. Please enter another value"); 
        type = animaltype.next(); 
       } 


      } 
      this.type = type; 
     } 
     } 



    public String getType() { 
     return this.type; 
    } 
} 

public class main { 
    public static void main(String[] args) { 
     Scanner animaltype = new Scanner(System.in); 
     System.out.println("Store the type of animal that is in the jungle"); 

     String rt = animaltype.next(); 
     Animal animal = new Animal(rt); 
     Jungle jungle = new Jungle(animal); 

     System.out.println(jungle.getAnimal().getType()); 
    } 
} 

public class Jungle { 
    private Animal animal; 


    public Jungle(Animal animal) { 
     this.animal = animal; 

    } 

    public Animal getAnimal() { 
     return animal; 
    } 
} 

Répondre

0

La condition dans votre boucle while est incorrecte. Il dit que si type n'est pas égal à au moins l'une des chaînes, alors continuez. Eh bien, type ne peut pas être égal à plus d'une de ces chaînes, de sorte que la boucle while continuera indéfiniment. Ce phénomène se produit parce que vous utilisez or et devez utiliser l'opérateur and. Vous devez remplacer la condition par (!type.trim().equals("cheetah") && (!type.trim().equals("tiger")) && (!type.trim().equals("Snake")) && (!type.trim().equals("lion"))) ou !(type.trim().equals("cheetah) || type.trim().equals("tiger") || type.trim().equals("Snake") || type.trim().equals("lion")). Les deux disent que si type est égal à l'une des chaînes, alors sortir de la boucle while.

PS: trim() n'est pas nécessaire puisque Scanner « s next méthode renvoie le jeton suivant, ce qui signifie essentiellement le mot suivant, alors type sera déjà rognée.