2011-03-02 102 views
0

我有以下代碼:的Java數組列表,鏈表和堆棧問題

public static void printCollection(ArrayList<Data> al, LinkedList<Data> ll, Stack<Data> stack){ 

    for(Iterator<Data> iter = al.iterator(); iter.hasNext();){ 
     Data x = (Data)iter.next(); 
     x.print(); 
    } 

    System.out.println(); 

} 

public static void main(String[] args){ 

    Data x = new Data("Fred", 41); 
    x.print(); 

    //ArrayList 
    ArrayList<Data> arrayList = new ArrayList<Data>(); 

    //LinkedList 
    LinkedList<Data> linkedList = new LinkedList<Data>(); 

    //Stack 
    Stack<Data> stack = new Stack<Data>(); 

    //'people' variables 
    Data person1 = new Data("Fred", 21); 
    Data person2 = new Data("Jane", 21); 
    Data person3 = new Data("Zoe", 23); 
    Data person4 = new Data("Harry", 78); 

    //ArrayList 
    arrayList.add(person1); 
    arrayList.add(person2); 
    arrayList.add(person3); 
    arrayList.add(2, person4); 

    printCollection(arrayList, null, null); 

    //LinkedList 
    linkedList.add(person1); 
    linkedList.add(person2); 
    linkedList.add(person3); 
    linkedList.add(2, person4); 

    printCollection(null, linkedList, null); 

    //Stack 
    stack.push(person1); 
    stack.push(person2); 
    stack.push(person3); 
    stack.push(person4); 

    while(stack.isEmpty() == false) 
    { 
     stack.pop().print(); 
    } 
    System.out.println(stack.size()); 

} 

...產生NullPointerException錯誤。但是,如果我刪除一些代碼行,使其看起來像這樣:

public static void printCollection(ArrayList<Data> al, LinkedList<Data> ll, Stack<Data> stack){ 

    for(Iterator<Data> iter = al.iterator(); iter.hasNext();){ 
     Data x = (Data)iter.next(); 
     x.print(); 
    } 

    System.out.println(); 

} 

public static void main(String[] args){ 

    Data x = new Data("Fred", 41); 
    x.print(); 

    //ArrayList 
    ArrayList<Data> arrayList = new ArrayList<Data>(); 

    //LinkedList 
    LinkedList<Data> linkedList = new LinkedList<Data>(); 

    //Stack 
    Stack<Data> stack = new Stack<Data>(); 

    //'people' variables 
    Data person1 = new Data("Fred", 21); 
    Data person2 = new Data("Jane", 21); 
    Data person3 = new Data("Zoe", 23); 
    Data person4 = new Data("Harry", 78); 

    //ArrayList 
    arrayList.add(person1); 
    arrayList.add(person2); 
    arrayList.add(person3); 
    arrayList.add(2, person4); 

    printCollection(arrayList, null, null); 

} 

} 

...然後它運行得很好。我檢查了多次,並且無法檢測到錯誤(沒有雙關語意圖(NullPointerException))。

錯誤不斷出現在以下行:

for(Iterator<Data> iter = al.iterator(); iter.hasNext();){ 
//remaining code omitted for illustration purposes 

我不知道它可能是,需要一些新鮮的眼光幫我看一看。

感謝您花時間閱讀本文。

米克

+0

堆棧跟蹤告訴了什麼?引發的異常行是哪一行? – Boris 2011-03-02 20:12:11

+0

@Boris嗨鮑里斯,我在發佈信息後立即更新了描述,因爲我忘記了包含它 - 現在正確描述。謝謝。 – MusTheDataGuy 2011-03-02 20:13:25

+0

太好了。雖然現在已經發布了答案:-) – Boris 2011-03-02 20:17:53

回答

3

如果有一個,你正在傳入null作爲唯一正在使用的集合:al,當你問它一個迭代器時哪個會拋出一個NPE。情況二不會發生。

另一個注意事項:你不需要投你的iter.next()電話。因爲這是(1)發生了什麼事情的方法和(2)反映了命名更好

public static void printCollection(Collection<Data> c){ 
for(Iterator<Data> iter = c.iterator(); iter.hasNext();) iter.next().print(); 
System.out.println();  
} 

爲了解決這個問題,你可能要改變的printCollection到簽名。編譯器會迫使你做一些清理工作,正確地做到這一點將會消除這個問題,或者讓問題變得更加明顯。

+0

我看到...是它導致錯誤的'空'嗎?我沒有列出其他人,因爲我認爲這是行不通的。所以在每種情況下,我需要列出'arrayList','linkedList'和'stack',對吧?相對於'null','linkedList'和'stack',例如?這是否有道理,如果是這樣,那是對的嗎? – MusTheDataGuy 2011-03-02 20:20:14

+0

是的......有點。它會解決'null'問題,但我認爲它不會解決你的代碼的結構問題 - 它不會對'linkedList'或'stack'做任何事情。 – Carl 2011-03-02 20:22:30

0

在一個點上你打電話:

printCollection(null, linkedList, null);

,看看你的方法的聲明。它試圖從第一個參數中獲得一個迭代器。這導致你的NPE。