2013-08-02 22 views
0

注意:我編輯我的代碼,我認爲人們試圖告訴我,但它仍然不會給我所需的輸出。現在我的輸出是「[email protected]」,但很多時候我輸入新的姓氏和名字。至少它是通過代碼崩潰大聲笑如何加載我創建的對象的實例的ArrayList

我正在學習如何使用ArrayLists,並需要加載一個數組列表與我創建的對象的實例。我知道如何使用數組來完成此任務,但是對於此任務,我需要使用ArrayList完成此任務。這是我需要做的一個例子。

// my "main" class 
package examples.search; 

import java.util.ArrayList; 

import dmit104.Util; 

public class MyPeople { 

    public static void main(String[] args) { 

     ArrayList<Person> people = new ArrayList<Person>(); 
     Person tempPerson = new Person(); 
     String firstName; 
     String lastName; 
     char choice = 'y'; 
     int count = 1; 

     // fill my ArrayList 
     do { 
      people.add(tempPerson); 
      // I have a Util class that has a prompt method in it 
      firstName = Util.prompt("Enter First Name: "); 
      lastName = Util.prompt("Enter Last Name: "); 

      tempPerson.setFirstName(firstName); 
      tempPerson.setLastName(lastName); 

      count++; 

      choice = Util.prompt(
        "Enter another person? [y or n]: ") 
        .toLowerCase().charAt(0); 

     } while (choice == 'y'); 

     // display my list of people 
     for(int i = 0; i < people.size(); i += 1) { 
      System.out.print(people.get(i)); 
     } 

    } 

} 

// my Person class which I am trying to build from 
public class Person { 

    // instance variables 
    private String firstName; 
    private String lastName; 

    // default constructor 
    public Person() { 
    } 

    public String getFirstName(){ 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 
} 

我試過了很多方法,但不管我的ArrayList沒有填滿。就像我剛纔提到的那樣,我可以做到這一點沒有問題的數組,或者即使我有一個加載的構造方法,但我沒有。在我的實際任務中,我應該用set方法來完成它。

我已經到處找,找不到我的問題的解決方案,併爲週五我的老師不在,

非常感謝你提前

利奧

+0

您的「默認構造函數」根本不是構造函數。類的構造函數必須使用與該類相同的名稱進行命名。在這種情況下,構造函數必須被命名爲Person()。另外,除非你非常需要一個可變類,否則你應該總是嘗試將你的值對象實例化爲不可變類型的實例。在你的情況下,lastname和firstname應該聲明爲final,並在Person()構造函數中設置爲它們的初始值。 – scottb

+0

你說你知道如何爲數組做這件事,它並沒有那麼不同,在創建'ArrayList''人後,你沒有任何對象,你必須創建它們並將它們添加到列表中。 – madth3

+0

哦,雅斯科特,它在我的課上說,聯繫它應該說人。當我將代碼粘貼到lol中時,我忘了改變這一點。我實際上正在做一個聯繫人管理器,我需要這樣做,因此用戶可以添加和刪除聯繫人並能夠更改它們(以防有人更改電子郵件,電話號碼等) – leoJaxx

回答

0

你有一個ArrayList<Person>它添加到人,但是,僅僅只定義的潛在名單Person個實例。但到目前爲止,每個列表條目都是nullget(i)返回null,並且以下null.setFirstName(..)會導致NullPointerException。

所以,你需要創建,都應該進入名單的Person實例:

firstName = Util.prompt("Enter First Name: "); 
Person p = new Person(); //create the instance 
people.add(p); //add the instance to the list 
p.setFirstName("..."); //set any values 
+0

謝謝f1sh。所以要添加多個實例到我的ArrayList我只需要在循環中添加上面的代碼?一個for循環也許? – leoJaxx

+0

我認爲它拋出'IndexOutOfBoundsException' –

+0

@leoJaxx是的,因爲你想創建一定數量的Person類實例並將它存儲在一個列表中,所以在循環中使用它。一個''for''循環是完美的。 – f1sh

2

你必須創建一個Person,然後add它到ArrayList

for (int i = 0; i < count; i++) { 
    Person person = new Person(); 

    person.setFirstName("Foo"); 
    person.setLastName("Bar"); 

    people.add(person); 
} 
+0

謝謝adashr。所以這將與我想要做的事情一起工作?我只是在「Person person = new Person()」這一行之間添加我的輸入;「和「person.setFirstName(firstName);」那個聽起來是對的嗎? – leoJaxx

1

它的崩潰,因爲你行people.get(i).setFirstName(firstName);首先嚐試的是在指數我,但你沒有設置任何東西。

無論是第一組的人[我]對空的人,也不能使用firstName和lastName的人,並使用people.add(person);

0

現在你存儲人物對象到ArrayList和打印該對象。 要在打印Person對象時打印名字和姓氏,必須重寫toString方法。 在Person類

public String toString(){ 
    return String.format("[Personn: firstName:%s ,lastName: %s]", firstName,lastName); 
} 
+0

這是我的班級失蹤的原因。我只是改變了身體只返回我的變量(firstName + lastName)謝謝。不過,我選擇了另一個答案,因爲他們給了我你現在看到的代碼。我原來的代碼是一團糟。謝謝你,我很欣賞它 – leoJaxx

0

至於你有第二個問題添加以下代碼,您必須覆蓋在Person類的toString()方法。您得到的輸出,如[email protected]Object類的默認toString()方法,其定義爲[email protected]