我遇到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不同步,但这是问题吗?我应该为一个简单的实施而担心吗?
答案 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();
}