JAVA LinkedList问题

时间:2012-09-15 06:34:02

标签: java linked-list

我遇到java.util.LinkedList问题。即使在向列表中添加元素之后,我在列表上使用poll()时也会收到空指针异常。我没有使用线程或任何类似于线程的东西 任何帮助表示赞赏。下面是myMethod代码,它是从另一个类的main方法调用的:

  void myMethod(Node start, int startRow){
    LinkedList<Node> queue = new LinkedList<Node>();
    LinkedList<Integer> rowQueue = new LinkedList<Integer>();

    queue.addFirst(start);
    rowQueue.addFirst((Integer)startRow);
    System.out.println( rowQueue.size() );      

    while (queue.size()!=0){            
        Node n = queue.poll();
        int row = rowQueue.poll().intValue(); //This is the line 33 in the error!
            /*Some remaining code which uses variables n and row. The thread of control does not reach here */

    }
  }

以下是输出:

Exception in thread "main" java.lang.NullPointerException
    at BFS.isConnected(LinkedListTest.java:33)
    at GraphsMain.main(GraphsMain.java:36)
1
ZERO

我很困惑,因为print语句在错误之后执行,显然我已经反过来写了它们。这是一个线程问题吗?我知道LinkedLists不同步,但这是问题吗?我应该为一个简单的实施而担心吗?

2 个答案:

答案 0 :(得分:4)

假设您的队列中有一些元素,而 rowQueue 中没有任何元素。那么你在while循环中的逻辑将如下工作:

  • Node n = queue.poll();将从队列中获取第一个元素并存储在n变量中。

  • 它会检查 rowQueue 的大小是否为零。如果是,它将打印零

  • 但是,并且你的问题在于,它仍会再次尝试poll(),这次获取null并在返回值上调用intValue() ,导致NullPointerException

问题在于您的代码中包含以下逻辑:

        if(rowQueue.size() == 0){
            System.out.println("ZERO");
        }
        int row = rowQueue.poll().intValue(); 

在您检查rowQueue.size()是否为0时,如果为true,则不仅要打印 Zero ,还要确保不执行int row = rowQueue.poll().intValue();。因此,您应该考虑突破循环或其他方面的事情。

所以你应该尝试这样的事情:

        if(rowQueue.size() == 0){
            System.out.println("ZERO");
            break; //This ensures that you come out of the loop
        }
        int row = rowQueue.poll().intValue(); 

答案 1 :(得分:1)

您缺少的是else声明,您获得NullPointerException的原因是因为ZERO中有rowQueue项(第33行引用)。

zero out http://iforce.co.nz/i/bnphs3ty.dvk.png

    int row; //declare and (optional : initialize it to something)
    //only poll the linkedlist if there is something in it...
    if(rowQueue.size() == 0){
        System.out.println("ZERO");
    } else {
     row = rowQueue.poll().intValue();
    }