链表,不断得到NullPointerException



我正在尝试将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 == nullcurrentNode.data == nullcurrectNode.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;
}

相关内容

  • 没有找到相关文章

最新更新