Java 链表,继续获取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

我试图将点添加到一个链表中,以便跟踪每个数据输入的频率。每次我运行这段代码时,它都会给我一个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(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))行中得到它