2013-11-14 3 views
-1

Я создаю функцию, которая удаляет узел из связанного списка, но он дает мне исключение NullPointerException. Я попытался проверить, имеет ли следующий следующий код null, но теперь он дает мне эту ошибку.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; 
    } 
} 

Вот основная часть полного Linked класса List

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 не имеет значения null, прежде чем использовать его. – ahansen

ответ

3

Вы получаете это исключение, потому что aNode является null и вы пытаетесь вызвать объект nullgetNext() метод, что означает, что в какой-то момент вы вызвали remove(null). Поскольку вы не показываете нам, где вы звоните remove(), невозможно сказать, но вам нужно либо убедиться, что этого не произойдет, либо проверить явно, если aNode - null, прежде чем пытаться вызвать методы на нем.

Если вы не ожидающейaNode быть null, но это, вы должны дважды проверить свой код, чтобы убедиться, что вы на самом деле реализации все правильно, так как это хороший признак того, что что-то происходит не так в другом месте в вашем алгоритм.

Update (если смотреть на отредактированном вопрос с новым кодом): У вас есть:

success = linkedList.remove(null); 

Это является источником вашей проблемы; мой вышеприведенный ответ охватывает ваши варианты устранения исключения.

В будущем вам необходимо изучить (и опубликовать) всю трассировку стека вашего исключения, которая четко идентифицирует эту строку кода.

1

Вы должны вызывать remove с установленным значениемNNode равным null. Другого объяснения этому поведению нет.

Полезно утверждать, что aNode! = Null, если вы этого не ожидаете.

+1

+1 для упоминания утверждений. Читателю: будьте осторожны, чтобы не использовать 'assert', как обычный старый' if' для условий проверки; утверждения должны использоваться для проверки/самодокументирования предположений, что вы делаете это, если не верно, нарушаете свой код и/или указываете на неработающий код в другом месте (например, ошибка утверждения указывает на ошибку). –

1

Это может означать только то, что aNode само по себе является нулевым

Смежные вопросы