2013-11-14 131 views
-1

我创建了一个从链表中删除节点的函数,但它给了我一个NullPointerException。我试图检查下一个是否为空,但它现在给我那个错误。尝试从链接列表中删除节点时出现NullPointerException?

删除功能:

private boolean remove(Node aNode) 
    { 
     Node prevNode, nextNode; 
     prevNode = this.getPrevious(aNode); 
     if(aNode.getNext()==null){ // NullPointerException 
      return false; 
     } 
     else{ 
      nextNode = aNode.getNext(); 
      prevNode.setNext(nextNode); 
     } 

     return false; 
    } 

Node类:

public class Node 
{ 
    /////////////////////////////////// 
    //   Properties   // 
    /////////////////////////////////// 
    private Object myData; 
    private Node myNext; 

    /////////////////////////////////// 
    //    Methods   // 
    /////////////////////////////////// 

    /** 
    * Default constructor for a node with null 
    * data and pointer to a next node 
    */ 
    public Node() 
    { 
     myData = null; 
     myNext = null; 
    } 

    /** 
    * Constructor for a node with some object for 
    * its data and null for a pointer to a next node 
    * 
    * <pre> 
    * pre: a null node 
    * post: a node with some object for its data and 
    *  null for a pointer to a next node 
    * </pre> 
    * 
    * @param datum an object for the node's data 
    */ 
    public Node(Object datum) 
    { 
     myData = datum; 
     myNext = null; 
    } 

    /** 
    * Constructor for a node with some object for 
    * its data and a pointer to another node 
    * 
    * <pre> 
    * pre: a null node 
    * post: a node with some object for its data and 
    *  a pointer to a next node 
    * </pre> 
    * 
    * @param datum an object for the node's data 
    * @param next the node that this node points to 
    */ 
    public Node(Object datum, Node next) 
    { 
     myData = datum; 
     myNext = next; 
    } 

    // Accessor methods 
    public void setData(Object datum) 
    { 
     myData = datum; 
    } 

    public Object getData() 
    { 
     return myData; 
    } 

    public void setNext(Node next) 
    { 
     myNext = next; 
    } 

    public Node getNext() 
    { 
     return myNext; 
    } 
} 

以下是完整的链表类的主要部分

public static void main(String[] args) 
    { 
     LinkedList linkedList; 
     Node testNode1, testNode2, testNode10, foundNode; 
     boolean success; 

     linkedList = new LinkedList(); 

     // Test "inList()" method 
     testNode1 = new Node(new Integer(1)); 
     testNode2 = new Node(new Integer(2)); 
     testNode10 = new Node(new Integer(10)); 

     // System.out.println("In List = "+linkedList.inList(null)); 
     linkedList.printList(); 
     foundNode = linkedList.findNode(new Integer(2)); 
     System.out.println("Found node "+foundNode); 
     success = linkedList.remove(null); 
     System.out.println("Success = "+success); 
     success = linkedList.remove(testNode1); 
     System.out.println("Success = "+success); 
     linkedList.addFirst(testNode1); 
     success = linkedList.remove(testNode1); 
     System.out.println("Success = "+success); 
     linkedList.printList(); 
     // System.out.println("In List = "+linkedList.inList(null)); 
     // System.out.println("In List = "+linkedList.inList(testNode1)); 
     // System.out.println("In List = "+linkedList.inList(testNode2)); 

     // Test "addLast()" and "addFirst()" methods 
     linkedList.addLast(new Node(new Integer(1))); 
     linkedList.addLast(new Node(new Integer(2))); 
     linkedList.addLast(new Node(new Integer(3))); 
     linkedList.addLast(testNode10); 
     foundNode = linkedList.findNode(new Integer(2)); 
     System.out.println("Found node "+foundNode.toString()); 
     linkedList.printList(); 

     Node testNode; 
     testNode = linkedList.getPrevious(foundNode); 
     System.out.println(testNode.getData()); 
     System.exit(0); 

     success = linkedList.insertBefore("H", testNode1); 
     System.out.println("Success = "+success); 
     linkedList.printList(); 
     linkedList.addFirst(new Node(new Integer(1))); 
     linkedList.addFirst(new Node(new Integer(2))); 
     linkedList.addFirst(new Node(new Integer(3))); 
     linkedList.printList(); 
     success = linkedList.insertBefore("A", testNode10); 
     System.out.println("Success = "+success); 
     linkedList.printList(); 

     // Test "remove()" 
     success = linkedList.remove(testNode1); 
     System.out.println("Success = "+success); 
     success = linkedList.remove(testNode2); 
     System.out.println("Success = "+success); 
     success = linkedList.remove(testNode10); 
     System.out.println("Success = "+success); 
     linkedList.printList(); 
    } 

} 
+0

你在哪里创建'aNode' – Prateek

+0

什么类是部分的removeNode?你指的是什么? – Andrew

+0

可能无法解决问题,但我会说在使用它之前检查aNode是否为空是个好主意。 – ahansen

回答

3

你得到的是例外,因为aNodenull并尝试调用null对象getNext()方法,这意味着您在某个时候调用remove(null)。由于您没有向我们显示您拨打remove()的位置,因此无法分辨,但是您需要确保不会发生,或者在尝试调用方法之前检查aNode是否为null

如果你不希望aNodenull却是,你应该仔细检查你的代码,以确保你实际上是正确执行的一切,因为这是一个很好的迹象,一些在其他地方去错了你算法。

更新(看你用新的代码编辑的问题):你有:

success = linkedList.remove(null); 

那是你的问题的根源;我上面的答案涵盖了修复异常的选项。

将来您需要检查(并发布)异常的整个堆栈跟踪,这将明确标识该代码行。

1

您必须调用remove,并将aNode设置为null。这种行为没有其他解释。

如果你不指望它是assert aNode!= null是一个好习惯。

+1

+1表示断言。给读者:但是,要小心,不要使用'assert'作为简单的旧if'来检查条件;断言应该被用来测试/自我记录你所做的假设,如果不是这样的话,会破坏你的代码和/或在别处指出破坏的代码(即断言失败表示一个错误)。 –

1

它只能意味着aNode本身就是空