Мой вывод выходит пустым вместо использования значения по умолчанию для строк - PullRequest
1 голос
/ 05 апреля 2019

У меня есть строка, которая устанавливается по умолчанию, когда входные данные находятся за пределами указанных значений, но он продолжает возвращать ноль вместо значения по умолчанию.какой код мне не хватает, чтобы иметь правильный вывод?

Я считаю, что мои целые и двойные значения используют значение по умолчанию правильно, но мои строки не.

// Это клип из моегопередний конец

import java.util.Scanner;
public class AnimalFrontEnd {
    public static final int ARRAY_SIZE = 10;
    Scanner keyboard = new Scanner(System.in) ;

    public static void main(String[] args) {
        boolean cont = true;
        int input = 0;
        int type = 0;
        AnimalCollection collection = new AnimalCollection(ARRAY_SIZE);
        Scanner keyboard = new Scanner(System.in) ;
        String rName = "";
        System.out.println("Welcome to the Cat and Dog Collection");
        while(cont) {
            System.out.println("1. Add a cat or dog \n2. Remove a cat or dog \n3. Quit \nEnter a selection");
            input = Integer.parseInt(keyboard.nextLine());
            switch(input) {
            case 1:
                System.out.println("Would you like to add \n1. A House Cat \n2. A Leopard \n3. A Domestic Dog \n4. A Wolf");
                type = Integer.parseInt(keyboard.nextLine());
                switch(type) {
                case 1:
                    HouseCat kitty = getHCat();
                    collection.addAnimal(kitty);
                    break;

// Далее в моем переднем конце

private static HouseCat getHCat() {
        String name;
        double weight;
        String mood;
        String cType;

        Scanner keyboard = new Scanner(System.in) ;
        System.out.println("Enter the cat's name, weight, mood, and type");
        name = keyboard.nextLine();
        weight = Double.parseDouble(keyboard.nextLine());
        mood = keyboard.nextLine();
        cType = keyboard.nextLine();
        return new HouseCat(name, weight, mood, cType);
    }

// мой абстрактный класс

public abstract class Animal {
    public String name;
    public double weight;

    Animal(){
        this.name = "Cuddles";
        this.weight = 0;
    }
    public Animal(String name, double weight) {
        this.setName(name);
        if(weight>0) {
            this.setWeight(weight);
        }
        else {
            System.out.println("Invalid weight");
        }
    }
    public String getAName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setWeight(double weight) {
        this.weight = weight;
    }
    public String toString() {
        return "Name: "+name+" Weight: "+weight;
    }
}

// расширение животного

public class Cat extends Animal {
    public String mood;

    Cat(){
        this.mood = "Sleepy";
    }
    public Cat(String name, double weight, String mood) {
        super(name, weight);
        if(mood.equalsIgnoreCase("sleepy")||mood.equalsIgnoreCase("playful")||mood.equalsIgnoreCase("hungry")) {
            this.setMood(mood);
        }
        else {
            System.out.println("Invalid mood");
        }
    }
    public String getMood() {
        return mood;
    }
    public void setMood(String mood) {
        this.mood = mood;
    }
    public String toString() {
        return super.toString()+" Mood: "+mood;
    }
}

// класс, который происходит от Cat

public class HouseCat extends Cat {
    public String cType;

    HouseCat(){
        this.cType = "Short Hair";
    }
    public HouseCat(String name, double weight, String mood, String cType) {
        super(name, weight, mood);
        if(cType.equalsIgnoreCase("Short Hair")||cType.equalsIgnoreCase("Bombay")||cType.equalsIgnoreCase("Ragdoll")||cType.equalsIgnoreCase("Sphinx")||cType.equalsIgnoreCase("Scottish Fold")) {
            this.setCType(cType);
        }
        else {
            System.out.println("Invalid type");
        }
    }
    public String getCType(){
        return cType;
    }
    public void setCType(String cType) {
        this.cType = cType;
    }
    public String toString() {
        return super.toString()+" Type: "+cType;
    }
}


, который я ожидаю показать:

Welcome to the Cat and Dog Collection
1. Add a cat or dog 
2. Remove a cat or dog 
3. Quit 
Enter a selection
1
Would you like to add 
1. A House Cat 
2. A Leopard 
3. A Domestic Dog 
4. A Wolf
1
Enter the cat's name, weight, mood, and type
Booph
23
unhappy
maine coon
Invalid mood
Invalid type
Collection: Name: Booph Weight: 23.0 Mood: Sleepy Type: Short Hair

Что на самом деле появляется:

Welcome to the Cat and Dog Collection
1. Add a cat or dog 
2. Remove a cat or dog 
3. Quit 
Enter a selection
1
Would you like to add 
1. A House Cat 
2. A Leopard 
3. A Domestic Dog 
4. A Wolf
1
Enter the cat's name, weight, mood, and type
Booph
23
unhappy
maine coon
Invalid mood
Invalid type
Collection: Name: Booph Weight: 23.0 Mood: null Type: null

Ответы [ 3 ]

2 голосов
/ 05 апреля 2019

У вашей домашней кошки есть два конструктора:

// one constructor
HouseCat(){
    this.cType = "Short Hair";
}

// another constructor
public HouseCat(String name, double weight, String mood, String cType) {
    super(name, weight, mood);
    if(cType.equalsIgnoreCase("Short Hair")||cType.equalsIgnoreCase("Bombay")||cType.equalsIgnoreCase("Ragdoll")||cType.equalsIgnoreCase("Sphinx")||cType.equalsIgnoreCase("Scottish Fold")) {
        this.setCType(cType);
    }
    else {
        System.out.println("Invalid type");
    }
}

Вы вызываете конструктор с 4 параметрами в вашем интерфейсе, а не конструктор без параметров, поэтому this.cType = "Short Hair"; никогда не запускался.

То же самое происходит в Cat - вы вызываете конструктор с 3 параметрами, а не без параметров, который устанавливает mood в значение по умолчанию.

Чтобы это исправить, просто удалите конструкторы без параметров и вместо этогоинициализировать переменные inline:

// in HouseCat
public String cType = "Short Hair"; // btw you shouldn't use public fields.

// in Cat
public String mood = "Sleepy";
0 голосов
/ 05 апреля 2019

вы создали два конструктора в своем классе Cat:

Cat(){
        this.mood = "Sleepy";
    }

и

    public Cat(String name, double weight, String mood) {
        super(name, weight);
        if(mood.equalsIgnoreCase("sleepy")||mood.equalsIgnoreCase("playful")||mood.equalsIgnoreCase("hungry")) {
           this.setMood(mood);
        }
        else {
            System.out.println("Invalid mood");
        }
    }

Только первый (без параметра) инициализирует поле настроения.И вы, очевидно, используете другой для создания своего экземпляра ...

У вас есть несколько решений: 1. удалить неиспользуемый конструктор и инициализировать настроение в другом конструкторе 2. изменить неиспользуемый конструктор на «простой»метод, который вы будете вызывать сразу после super в конструкторе 3. ...

Пример:

public Cat(String name, double weight, String mood) {
  super(name, weight);
  this.mood = "Sleepy";

 if(mood.equalsIgnoreCase("sleepy")||mood.equalsIgnoreCase("playful")||mood.equalsIgnoreCase("hungry")) {
            this.setMood(mood);
        }
        else {
            System.out.println("Invalid mood");
        }
    }

HTH!

0 голосов
/ 05 апреля 2019

Когда вы создаете объект HouseCat, который вы назвали параметризованным Constructor, и в конструкторе по умолчанию вы инициализировали Type и Mood. Вот почему они равны нулю.

вам нужно установить эти значения в параметризованном Constructor, тогда они будут показывать ожидаемый результат. Как и Housecat конструктор должен изменить

public HouseCat(String name, double weight, String mood, String cType) {
        super(name, weight, mood);
        if(cType.equalsIgnoreCase("Short Hair")||cType.equalsIgnoreCase("Bombay")||cType.equalsIgnoreCase("Ragdoll")||cType.equalsIgnoreCase("Sphinx")||cType.equalsIgnoreCase("Scottish Fold")) {
            this.setCType(cType);
        }
        else {
            System.out.println("Invalid type");
            this.cType = "Short Hair";//<------------- set default value here
        }
    }

и Cat Конструктор должен быть изменен как

public Cat(String name, double weight, String mood) {
        super(name, weight);
        if(mood.equalsIgnoreCase("sleepy")||mood.equalsIgnoreCase("playful")||mood.equalsIgnoreCase("hungry")) {
            this.setMood(mood);
        }
        else {
            System.out.println("Invalid mood");
           this.mood = "Sleepy";//<-------------  set default value here
        }
    } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...