2013-07-14 2 views
1

У меня есть программирование объектов обучения, и я приложил к тестированию. Моя программа сканирует информацию о домашних животных и распечатывает ее на экране (основы основ). Когда я вхожу животное информация:Инициализация неправильного значения Java

name - Jimbo (min 3 max 16 letters) 
type - 2 (dog) 
gender - 1 (male) 

Я получил этот результат:

Pet info: 
Your pet name is Jimbo, pet type is dog, and gender is male. 

это все писать нормально, но когда я ввожу это:

name - Ji 
type - 8 (out of choices) 
gender - 8 (out of choices) 

я получил этот результат:

Pet info: 
Your pet name is ji, pet type is unknown type, and gender is unknown gender. 

ИНСТРУМЕНТ ead ji Я должен получить слова "wrong name length", но он по-прежнему печатает ji. Im смущен. Я начал программировать Java-объекты и хочу полностью его понять.

Main.java

import java.util.Scanner; 

public class Main { 
    public static void main(String[] args){ 
     Scanner key_scan = new Scanner (System.in); 


     System.out.println("Enter your pet name(min 3 letters, max 16 letters): ");// select your pet name 
     String pet_name = key_scan.nextLine(); 

     System.out.println("Enter your pet type number 1(cat), 2(dog), 3(mouse), 4(fish): ");// select your pet type 
     int pet_type = key_scan.nextInt(); 

     System.out.println("Enter your pet gender 1(male), 2(female): ");// select your pet gender 
     int pet_gender = key_scan.nextInt(); 

     petInfo obj_petInfo = new petInfo(pet_name, pet_type, pet_gender); 

     System.out.printf("Pet info:\n%s", obj_petInfo.formatPetInfo()); 

     key_scan.close(); // close scanner key_scan 
    } 
} 

petInfo.java

public class petInfo { 
    private String pet_name; 
    private int pet_type; 
    private int pet_gender; 

    public petInfo(){ 
     this("Unknown", 0, 0); 
    } 

    public petInfo(String pet_name_t, int pet_type_t, int pet_gender_t){ 
     pet_name = pet_name_t;// string name 
     pet_type = pet_type_t;// int type 
     pet_gender = pet_gender_t;// int gender 
    } 
////////////////////////////////set methods 
    public void setPet_name(String pet_name){ 
     pet_name = ((pet_name.length() >= 3 && pet_name.length() <= 16)? pet_name : "wrong name length"); 
    } 
///////////////////////////////// pet type 
    public void makePet_type_cat(int pet_type){ 
     pet_type = 1; 
    } 

    public void makePet_type_dog(int pet_type){ 
     pet_type = 2; 
    } 

    public void makePet_type_mouse(int pet_type){ 
     pet_type = 3; 
    } 

    public void makePet_type_fish(int pet_type){ 
     pet_type = 4; 
    } 
////////////////////////////// pet gender 
    public void makePet_gender_male(int pet_gender){ 
     pet_gender = 1; 
    } 

    public void makePet_gender_female(int pet_gender){ 
     pet_gender = 2; 
    } 

    boolean pet_is_male(){ 
     return this.pet_gender == 1; 
    } 

    boolean pet_is_female(){ 
     return this.pet_gender == 2; 
    } 

//////////////////////////////// pet type check 
    boolean pet_is_cat(){ 
     return this.pet_type == 1; 
    } 

    boolean pet_is_dog(){ 
     return this.pet_type == 2; 
    } 

    boolean pet_is_mouse(){ 
     return this.pet_type == 3; 
    } 

    boolean pet_is_fish(){ 
     return this.pet_type == 4; 
    } 
/////////////////////////////////////get methods 
    public String getPet_name(){ 
     return pet_name; 
    } 

    String getPet_type(){ 
    if (this.pet_is_cat()) 
      return "cat"; 
     else if(this.pet_is_dog()) 
      return "dog"; 
     else if(this.pet_is_mouse()) 
      return "mouse"; 
     else if(this.pet_is_fish()) 
      return "fish"; 
     else 
      return "unknown type"; 
    } 

    String getPet_gender(){ 
     if(this.pet_is_male()) 
      return "male"; 
     else if (this.pet_is_female()) 
      return "female"; 
     return "unknown gender"; 
    } 

    String formatPetInfo(){ 
     return String.format("Your pet name is %s, pet type is %s, and gender is %s.", getPet_name(), this.getPet_type(), this.getPet_gender()); 
    } 
} 
+1

не связанных, но пожалуйста [читать Java именования] (http://www.oracle.com/technetwork/java/javase/documentation/codeconventions- 135099.html # 367). Также ваш код очень плохой ООП. Возможно, вам понравится [наследование] (http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html) и [полиморфизм] (http://docs.oracle.com/javase/tutorial/ Java/IandI/polymorphism.html). – m0skit0

+0

И перечисляет, если на то пошло. Это отличный пример. –

+1

@ m0skit0 спасибо за совет ур о соглашениях об именах, теперь я меняю все методы, имена переменных, я буду пытаться писать прямо сейчас :) –

ответ

3

Проблема заключается в том, что, хотя setPetName делает проверку имени, конструктор выполняет "прямое" назначение без проверки.

Измените конструктор следующим образом:

public petInfo(String pet_name_t, int pet_type_t, int pet_gender_t){ 
    setPet_name(pet_name_t);// string name 
    pet_type = pet_type_t;// int type 
    pet_gender = pet_gender_t;// int gender 
} 

Это позволит устранить эту проблему.

Обратите внимание, что ваш код противоречит соглашениям об именах Java: вместо вызова метода setter setPet_name, соглашения об именах предлагают setPetName. Следующие соглашения об именах очень важны для обеспечения удобочитаемости кода, поэтому другие имена методов должны быть изменены аналогичным образом.

+0

спасибо, я изменил конструктор, и это работает :) –

2

Вы не назвали свой setPet_name, где бы он ни находился, в основном сделайте валидацию. Значения имени присваиваются по следующему вызову конструктора:

petInfo obj_petInfo = new petInfo(pet_name, pet_type, pet_gender); 

который вызывает ниже конструктор и присваивает имя без проверки:

public petInfo(String pet_name_t, int pet_type_t, int pet_gender_t){ 
    pet_name = pet_name_t;// string name 
    pet_type = pet_type_t;// int type 
    pet_gender = pet_gender_t;// int gender 
} 

Вы можете позвонить сеттер в конструкторе, чтобы назначить значения вместо прямого присваивания:

public petInfo(String pet_name_t, int pet_type_t, int pet_gender_t){ 
    setPet_name(pet_name_t);// string name 
    pet_type = pet_type_t;// int type 
    pet_gender = pet_gender_t;// int gender 
} 
+0

спасибо за ваш ответ, изменен конструктор и теперь его рабочий :) –

0

, если вы хотите использовать условные обозначения, которые по-прежнему возможно, Java имеет ключевое слово this, который относится к текущему объекту, так что вы можете использовать this как:

public petInfo(String pet_name_t, int pet_type_t, int pet_gender_t){ 
    this.pet_name = pet_name_t;// pet_name_t refers to local variable get from parameterlist but this.pet_name_t refers to global variable of class what you defined as "private String pet_name;" 
    this.pet_type = pet_type_t;// int type 
    this.pet_gender = pet_gender_t;// int gender 
} 
Смежные вопросы