Java ArrayList, LinkedList & Stack проблема - PullRequest
0 голосов
/ 02 марта 2011

У меня есть следующий код:

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

Я понятия не имею, что это может быть, и мне нужны свежие глаза, чтобы помочь мне и взглянуть.

Спасибо, что нашли время, чтобы прочитать это.

Мик

Ответы [ 2 ]

3 голосов
/ 02 марта 2011

В первом случае вы передаете null для единственной используемой коллекции: al, которая, конечно, выдает NPE, когда вы запрашиваете у него итератор. Это не случится в случае два.

Еще одно замечание: вам не нужно делать iter.next() вызов.

Чтобы исправить это, вы можете изменить подпись printCollection на:

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

, поскольку это (1) то, что происходит в методе, и (2) лучше отражает наименование. Компилятор заставит вас выполнить некоторую очистку, и правильное выполнение этой процедуры устранит проблему или сделает ее более очевидной там, где проблема.

0 голосов
/ 02 марта 2011

В один момент вы звоните:

printCollection(null, linkedList, null);

и посмотрите объявление вашего метода. Он пытается получить итератор из первого параметра. Это вызывает ваш NPE.

...