我正在尝试将Point添加到链接列表中,以便跟踪每个数据项的频率。每次运行此代码时,它都会给我一个NullPointerException。我没有;我不明白为什么,在我看来,在它增加频率后,它似乎会产生一个间隙,但我似乎无法修复它
if(firstNode == null)
{
addPair = new Pair(aData, 1);
firstNode = new Node(null, addPair, null);
lastNode = firstNode;
currentNode = firstNode;
numberOfNodes++;
}
else
{
currentNode=firstNode;
for(int count = 0; count<numberOfNodes; count++)
{
if(currentNode.data.fst().equals(aData))
{
addPair = new Pair(aData,currentNode.data.freq()+1);
if(count==0)
firstNode= new Node(currentNode,addPair,null);
currentNode = new Node(currentNode,addPair,null);
break;
}
if(count == (numberOfNodes-1) && currentNode.data.fst() !=(aData))
{
addPair = new Pair(aData,1);
Node newNode = new Node(currentNode, addPair, null);
currentNode.next = newNode;
lastNode = newNode;
numberOfNodes++;
break;
}
currentNode = currentNode.next;
}
}
numberOfEntries++;
private class Node
{
private Node previous;
private Pair data;
private Node next;
private Node(Node previousNode, Pair<T,Integer> addPair, Node nextNode)
{
previous = previousNode;
data = addPair;
next = nextNode;
}
}
如果在线路if(currentNode.data.fst().equals(aData))
上接收NPE,则选择currentNode == null
、currentNode.data == null
或currectNode.data.fst() == null
。诊断问题的第一件事是找出以下哪种情况。我建议您将以下语句放在这行之前,然后重新运行您的代码:
assert currentNode != null;
assert currentNode.data != null;
assert currentNode.data.fst() != null;
除了诊断之外,还有许多方法可以使代码更安全。首先,你真的不需要使用计数来遍历你的链表。当next
指针是null
:时结束会更安全
for (Node current = firstNode; current != null; current = current.next) {
if (current.data.equals(aData)) {
// increment counter
return;
}
}
主要问题在这一行
firstNode= new Node(currentNode,addPair,null);
当你增加第一个节点的频率时,你并没有设置下一个Node
,所以你得到的列表只有一个节点,但大小是多个。线路的类似问题
currentNode = new Node(currentNode,addPair,null);
此外,所有第一个if
语句都是错误的。你正在破坏列表中的链接,它应该像这个一样
if (currentNode.data.fst().equals(aData)) {
addPair = new Pair(aData, currentNode.data.freq() + 1);
// create new node
Node c = new Node(currentNode.previous, addPair, currentNode.next);
// set links to new node
if (currentNode.previous != null) {
currentNode.previous.next = c;
}
if (currentNode.next != null) {
currentNode.next.previous = c;
}
if (count == 0) {
firstNode = c;
}
break;
}
为了简化代码并减少可能的错误,我建议在Pair
类中编写一些类似incFrequency()
的函数。然后在循环中做一些类似的事情
if (currentNode.data.fst().equals(aData)) {
currentNode.data.incFrequency();
break;
} else if(count == (numberOfNodes-1) && currentNode.data.fst() !=(aData)) {
// add new node to the end
}
也可以重写for
循环
currentNode = firstNode;
// iterate through list
while (currentNode != null) {
// process currentNode
...
// move to the next node
currentNode = currentNode.next;
}