Java 链表,继续获取NullPointerException
我试图将点添加到一个链表中,以便跟踪每个数据输入的频率。每次我运行这段代码时,它都会给我一个NullPointerException。我不知道;我不明白为什么,对我来说,似乎在增加频率后,它会产生一个间隙,但我似乎无法修复它Java 链表,继续获取NullPointerException,java,linked-list,Java,Linked List,我试图将点添加到一个链表中,以便跟踪每个数据输入的频率。每次我运行这段代码时,它都会给我一个NullPointerException。我不知道;我不明白为什么,对我来说,似乎在增加频率后,它会产生一个间隙,但我似乎无法修复它 if(firstNode == null) { addPair = new Pair(aData, 1); firstNode = new Node(null, addPair, null); lastNode = f
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(firstNode==null)
{
addPair=新的一对(aData,1);
firstNode=新节点(null,addPair,null);
lastNode=firstNode;
currentNode=firstNode;
numberOfNodes++;
}
其他的
{
currentNode=firstNode;
对于(int count=0;count如果您在If(currentNode.data.fst().equals(aData))
行接收NPE,则currentNode==null
或currentNode.data==null
或currentNode.data.fst()==null
。诊断问题的第一件事是找出哪种情况。我建议您将以下语句放在这一行之前,然后重新运行代码:
assert currentNode != null;
assert currentNode.data != null;
assert currentNode.data.fst() != null;
除此之外,还有许多方法可以使代码更安全。首先,您确实不需要使用计数来遍历链接列表。更安全的方法是在下一个指针为null
时结束:
for (Node current = firstNode; current != null; current = current.next) {
if (current.data.equals(aData)) {
// increment counter
return;
}
}
主要问题在这方面
firstNode= new Node(currentNode,addPair,null);
当您增加第一个节点的频率时,您并没有设置下一个节点
,因此您只得到一个节点的列表,但其大小为多个。line也存在类似的问题
currentNode = new Node(currentNode,addPair,null);
如果
语句有误,那么所有的第一个语句都是错误的。您正在破坏列表中的链接,应该是这样的
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
}
您还可以为
循环重写
currentNode = firstNode;
// iterate through list
while (currentNode != null) {
// process currentNode
...
// move to the next node
currentNode = currentNode.next;
}
你能分享一下你的stacktrace吗?给我们看看节点
类怎么样?你基本上要求我们在干草堆里找一根针,但只给了我们一把草堆顶部的干草,让我们看看。添加了节点类你从哪里得到NPE?@SklogW我在if(currentNode.data.fst().equals(aData))行中得到它