2016-08-07 3 views
0

Я пытаюсь выяснить, почему мой метод Remove возвращает исключение NullPointerException. Я тестировал против многочисленных сценариев и это, кажется, работает хорошо, по большей части, но когда я тестировал против моего профессора кода, я получаю NullPointerException:Удалить метод в LinkedList возвращает NullPointerException

Против моего драйвера (это выход):

List: Hamadi, Salisu, Galo, Ballo, 
4 
Replacing Galo with Abdullahi 
List: Hamadi, Salisu, Abdullahi, Ballo, 
Removing Salisu from the list 
List: Hamadi, Abdullahi, Ballo, 
List: 65, 21, 42, 
Removing 65 from the list 
List: 21, 42, 
List: 1, 3, 
Removing 1 from the list 
List: 3, 
List: 25, 3, 

Все работает хорошо, пока я не проверить код для моего метода удаления (см ниже методы) против моего наставники кода:

/** Remove a node at the specified index and return its data element. 
    * @param index The index of the element to remove 
    * @return The data element removed 
    * @throws IndexOutOfBoundsException If index is outside the bounds of the list 
    * 
    */ 
    public E remove(int index) 
    { 
     // TODO: Implement this method 
     if (index < 0 || index >= size() || size() == 0) { 
      throw new IndexOutOfBoundsException("Nodes are not within the array"); 
     } 
     int i = 0; 
     LLNode<E> currentNode = head.next; 

     while (i < size) { 
      if (i == index) { 

        System.out.println("Removing " + currentNode.data + " from the list"); 
        currentNode.next.prev = currentNode.prev; 
        currentNode.prev.next = currentNode.next; 

        size--; 
        return currentNode.data; 

      } 
      currentNode = currentNode.next; 
      i++; 
     } 


     return null; 
    } 

в настоящее время, кстати, я реализованное удаление узла является Узел, который удаляется для следующего узла, t к предыдущему узлу удаленного узла и наоборот.

Любой вход был бы очень благодарен за то, что я могу сделать для дальнейшего улучшения метода удаления, чтобы предотвратить (и обойти) любые возможные ошибки NullExceptionErrors. Благодаря!

+1

Что такое переменный 'размер' во время цикла? – SomeDude

+1

вы должны проверить условия типа 'head.next == null', где список имеет только один элемент. и когда вы указываете индекс как 'size', и нет' next' – SomeDude

ответ

1

Я думаю, что проблема у вас возникли из этой строки:

currentNode.next.prev = currentNode.prev; 

Если индекс будет удален последний элемент в списке (например, индекс == размер() - 1), то это будет удовлетворяют условиям цикла, и приведенный выше код будет выполнен. Однако, поскольку это последний элемент в списке, currentNode.next имеет значение null. Строка, приведенная выше, вызывает значение .prev по нулевому значению, которое приводит к нулевому указателю.

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