-2

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

  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

我很困惑,因为打印语句在错误之后执行,而且显然我已经以相反的方式编写了它们。这是一个线程问题吗?我知道 LinkedLists 不同步,但这就是问题所在吗?我应该担心它只是为了一个简单的实现吗?

4

3 回答 3

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 时,如果为真,则不仅应打印,还应确保不执行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(); 
于 2012-09-15T06:42:43.333 回答
1

LinkedList<E>.poll()返回链接列表中的对象,如果列表为空,则返回 null。当您尝试从中检索整数值时,您的列表很可能是空的,因为您没有将该调用放在列表大小的检查中。

于 2012-09-15T06:39:51.743 回答
1

你所缺少的只是一个else声明,你得到 a 的原因NullPointerException是因为里面有ZERO项目rowQueue(在第 33 行引用)。

清零
(来源:iforce.co.nz

    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();
    }
于 2012-09-15T06:46:24.693 回答