2016-12-30 5 views
0

私はリストから特定の器官を削除するための削除関数を作成しようとしています。 NullPointerExceptionのエラーが発生する 私の間違いを知りたいです。 このエラーが発生するのはなぜですか。おかげさまで 一般的な二重リンクリストから削除する方法

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; 
} 

ノード:

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; 
} 

}

メイン:

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()); 
} 

エラー:

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

「head」が「null」または「head.prev」のいずれかです。 'head'はできません。あるいは、あなたは例外を1行早く得るでしょう。だから 'head.prev'はnullなので、' head.prev.next'に代入しようとするとNPEになります。 –

+0

'head.prev'に言及していたはずのことは何でしたか?あなたのコードのすべての行を調べなければ、私はそれが 'null 'であると予想していました。 –

+0

[NullPointerExceptionとは何か、それを修正する方法は?](http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) ) –

答えて

1

最初の予見の問題はLinkedListDoubleクラスのadd方法です。それでは、headを作成した後、LDNodeクラスの他のインスタンスとリンクしないでください。したがって、headはいつもnullとしてprevと表示されるため、NPEを取得しています。さらに、addメソッド内のコードは、nullprevの値がLDNodeというオブジェクトと異なることはありません。 LinkedListDoubleクラスのaddメソッドを改訂してください。

関連する問題