2016-12-30 3 views
0

Ich versuche eine Entfernungsfunktion zu erstellen, um ein bestimmtes Organ aus der Liste zu entfernen. Ich bekomme einen Fehler von NullPointerException Ich würde gerne wissen, was mein Fehler ist. Warum bekomme ich diesen Fehler? Danke.So entfernen Sie aus der generischen doppelt verketteten Liste

A method to delete a specific organ. The method returns the deleted organ, organ lab is not on the list, it returns null

import java.util.ListIterator; 
import java.util.NoSuchElementException; 

public class LinkedListDouble<T> { 
    private LDNode<T> head; 
    private LDNode<T> tail; 
    public int size; 


LinkedListDouble(){ 
    this.head = null; 
    size = 0; 
} 


public void add(T item){ // add item to the list 
    if(head == null){ 
     head = new LDNode<T>(item,null,null); 
    } 
    else{ 
     LDNode<T> n = new LDNode<T>(item, null, null); 
     while(n.next != null){ 
      n = n.next; 
     } 
     n.next = new LDNode<T>(item,n,null); 
    }size++; 
} 

public T remove(T item){ // remove item from the list 
    T ans=null; 
    LDNode<T> n = head; 
    int i=0; 

    while(n.data != item){ 
     n = n.next; 
     i++; 
    } 
    if(i == size) return null; 
    if(n == head) { 
     ans = head.data; 
     head.prev.next = head.next; 
     head.next.prev = head.prev; 
     head = head.next; 
    } 
    else { 
     ans = n.data; 
     n.prev.next = n.next; 
     n.next.prev = n.prev; 
    } 
    size--; 
    return ans; 

    } 

public int size(){ 
    return size; 
} 

Knoten:

public class LDNode<T> { 
T data; 
LDNode<T> next,prev; 


LDNode(){ 
    next = null; 
    prev = null; 
    data = null; 
} 

/*LDNode(T data){ 
    this(data,null,null); 
}*/ 
LDNode(T data , LDNode<T> next , LDNode<T> prev){ 
    this.data = data; 
    this.next = next; 
    this.prev = prev; 
} 
LDNode(LDNode<T> Other){ 
    this.data = Other.data; 
    this.next = Other.next; 
    this.prev = Other.prev; 
} 

T getData(){ 
    return data; 
} 

public void setNextNode(LDNode<T> next){ 
    this.next = next; 
} 
public LDNode<T> getPrevNode(){ 
    return prev; 
} 
public void setPrevNode(LDNode<T> prev){ 
    this.prev = prev; 
} 
public void setData(T data){ 
    this.data = data; 
} 
public LDNode<T> getNextNode(){ 
    return next; 
} 

}

Main:

public static void main(String[] args) { 
    LinkedListDouble<Integer> itay = new LinkedListDouble<>(); 
    itay.add(1); 
    itay.add(2); 
    itay.add(3); 
    itay.add(4); 
    itay.add(5); 
    itay.add(6); 
    System.out.println(itay.size()); 
    itay.remove(1); 
    System.out.println(itay.size()); 
} 

Fehler:

Exception in thread "main" java.lang.NullPointerException 
at Matala2.LinkedListDouble.remove(LinkedListDouble.java:45)//head.prev.next = head.next; 
at Matala2.LinkedListDouble.main(LinkedListDouble.java:78) //itay.remove(1); 
+0

Entweder 'head' ist' null' oder 'head.prev' ist. 'Kopf' kann nicht sein, sonst hättest du eine Zeile früher die Ausnahme bekommen. So ist 'head.prev' gleich null, so dass Sie versuchen,' head.prev.next' zuzuweisen, gibt NPE. –

+0

Was hatten Sie erwartet, dass sich 'head.prev' darauf beziehen sollte? Ohne jede Zeile in Ihrem Code zu studieren, hätte ich erwartet, dass es "null" ist. –

+0

Mögliches Duplikat von [Was ist eine NullPointerException, und wie behebe ich sie?] (Http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) –

Antwort

1

Das erste Problem ist, vorgesehene im add Verfahren der LinkedListDouble Klasse. Sehen Sie, Sie erstellen head und danach verknüpfen Sie es nicht mit einer anderen Instanz der LDNode Klasse. Also, head haben immer null als prev, deshalb erhalten Sie NPE. Darüber hinaus legt ein Code innerhalb der add Methode nie einen anderen Wert als null als prev Wert von LDNode Objekt. Überlegen Sie, Ihre add Methode der LinkedListDouble Klasse zu überarbeiten.

Verwandte Themen