【问题标题】:java - My ArrayList only returns Nullsjava - 我的 ArrayList 只返回 Null
【发布时间】:2013-11-01 19:26:57
【问题描述】:

我对 java 还很陌生,我不明白为什么我的 ArrayList 只返回 Null!

我正在开发一个地址簿应用程序,该应用程序应该将人员存储为对象,并且它应该存储全名、地址、城市、州、邮编和电话号码,但是在我运行程序之后,所有存储的内容都是空值...

人员类:

public class Person implements Comparable<Person>{
private String FULLNAME;
private String ADDRESS;
private String CITY;
private String STATE;
private String ZIP;
private String PHONE;

public Person(String FULLNAME, String ADDRESS,  String CITY, String STATE, String ZIP, String PHONE) {

}

//GETTERS
public String getFullName(){
    return FULLNAME;
}
public String getAddress(){
    return ADDRESS;
}
public String getCity(){
    return CITY;
}
public String getState(){
    return STATE;
}
public String getZip(){
    return ZIP;
}
public String getPhone(){
    return PHONE;
}

//SETTERS
public void setFullName(String fullname){
    this.FULLNAME = fullname;
}
public void setAddress(String address){
    this.ADDRESS=address;
}
public void setCity(String city){
    this.CITY=city;;
}
public void setState(String state){
    this.STATE=state;
}
public void setZip(String zip){
    this.ZIP=zip;
}
public void setPhone(String phone){
    this.PHONE=phone;
}

TestAddressBook 类:

public class TestAddressBook {

static Scanner sc= new Scanner(System.in);

static String fullname;
static String address;
static String city;
static String state;
static String zip;
static String phone;
static String in;
static char input;
public static void main(String[] args){
    //Declare Variables to store user input in before its sent to the 
    //Persons Class and stored in the Array List
    //Instance of a Person
    Person person = new Person(fullname, address, city, state, zip, phone);
    //Declaring ArrayList
    ArrayList<Person> AddressBook = new ArrayList<Person>();

    //Launch Menu
    do{
        Menu();
        //gathers user input
        in=sc.nextLine();
        input=in.toUpperCase().charAt(0);
        //decides what to do based on user selection
        switch (input){
        case 'A': 
            addPerson(AddressBook, person);
            break;
        case 'D':
            //deletePerson(AddressBook);
            break;
        case 'M':
            //modifyPerson(AddressBook);
            break;
        case 'S':
            //search(AddressBook);
            break;  
        }
    }while(input!='Q');
    System.out.println("Application Closed");
    System.exit(0);
}

public static void Menu(){
    //User Selection
    System.out.println("Address Book Menu");
    System.out.println("\tEnter A to (A)dd a Person");
    System.out.println("\tEnter D to (D)elete a Person");
    System.out.println("\tEnter M to (M)odify a Person");
    System.out.println("\tEnter S to (S)earch Address Book");
    System.out.println("\tEnter Q to (Q)uit");
    System.out.println("Please enter your choice");
}

public static void addPerson(ArrayList<Person> AddressBook, Person person){
    System.out.println("Please input the person's information (one line per field)");
    //User Input
    System.out.println("\nPlease enter person's full name: ");
    fullname=sc.nextLine();
    person.setFullName(fullname);
    System.out.println("\nPlease enter person's street address: ");
    address=sc.nextLine();
    person.setAddress(address);
    System.out.println("\nPlease enter person's city: ");
    city=sc.nextLine();
    person.setCity(city);
    System.out.println("\nPlease enter person's state: ");
    state=sc.nextLine();
    person.setState(state);
    System.out.println("\nPlease enter person's zip code: ");
    zip=sc.nextLine();
    person.setZip(zip);
    System.out.println("\nPlease enter person's phone number: ");
    phone=sc.nextLine();
    person.setPhone(phone);


    //Set arrayList
    AddressBook.add(new Person(fullname, address, city, state, zip, phone));

    //test to see if values stored
    System.out.println(AddressBook.get(0).getFullName());

}

在添加人员结束时,返回的都是'Null'

任何帮助将不胜感激,谢谢

【问题讨论】:

  • 您似乎正在填充传递给 addPerson() 方法的 Person,然后单独创建要添加到数组列表的人员的新实例。这个新实例是用一个不做任何事情的构造函数调用的,所以它的所有值都设置为 null。
  • 您的 Person 对象似乎符合 JavaBean 模式,特别是,您定义了 getter 和 setter,并且您似乎使用 setter 来初始化您的对象(这本质上是危险的和/或脆弱的)。如果你打算使用 setter 来初始化你的对象,那么你不需要在你的构造函数中传递参数。对于 JavaBean 模式,您应该使用无参数构造函数。

标签: java arraylist null


【解决方案1】:

问题不在于地址簿,而在于人。不要传入一个人,也不要使用 setter 方法。

然后,您只需将获得的每个值设置为 String(或 int),这样您就可以在创建人员时将它们传入。

最后,您需要在构造函数中设置字段。

【讨论】:

    【解决方案2】:

    你的构造函数没有做任何事情。您需要为私有实例变量赋值。
    例如
    this.FULLNAME = FULLNAME;

    【讨论】:

      【解决方案3】:

      那是因为你的构造函数没有做任何事情。

      你需要这样的东西。

      public Person(String fullName, String address,  String city, String state, String zip, String phone) {
          this.fullName = fullName;
          this.address = address;
          ... and so on ...
      }
      

      请注意,我已将参数名称更改为驼峰式。这是为了遵守 Java 命名约定。

      【讨论】:

        【解决方案4】:

        你的构造函数没有初始化字段:

        public Person(String FULLNAME, String ADDRESS,  String CITY, String STATE, String ZIP,
           String PHONE) {
        }
        

        应该改为

        public Person(String FULLNAME, String ADDRESS,  String CITY, String STATE, String ZIP,
           String PHONE) {
        
          this.FULLNAME=FULLNAME;
          this.ADDRESS=ADDRESS;
          ...
        }
        

        【讨论】:

        • 他通过调用 setter 方法来初始化他的对象。构造函数是多余的。
        • 但是当他使用:AddressBook.add(new Person(fullname, ... 这意味着新的人对象,没有准备好...
        猜你喜欢
        • 2012-05-27
        • 1970-01-01
        • 2013-11-19
        • 1970-01-01
        • 2021-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多