0

AbstractList を拡張する MyLinkedList クラスの NPE に問題があります。これらのコンストラクターから始めます。

プライベート Node クラスのコンストラクター:

public Node(T nodeData, Node<T> nodePrev, Node<T> nodeNext)
    {
        this.data = nodeData;
        this.prev = nodePrev;
        this.next = nodeNext;
    }

MyLinkedList クラスのコンストラクター

MyLinkedList()
{
    this.head = new Node<T>(null, null, null); 
    this.tail = new Node<T>(null, null, null);
    this.size = 0;
}

MyLinkedList(Node<T> head, Node<T> tail, int size)
{
    this.head = head;
    this.tail = tail;
    this.size = size;
}

ここでは、このメソッドを使用してインデックスでノードを返そうとします:

private Node<T> getNth(int index)
{
    Node<T> temp;
    if(index < 0 || index > size)
        throw new IndexOutOfBoundsException();

    if(index < this.size() / 2)
    {
        temp = this.head;
        for(int i = 0; i < index; i++)
        {
            temp = temp.getNext();
        }
    }
    else
    {
        temp = this.tail;
        for(int i = this.size(); i > index; i--)
        {
            temp = temp.getPrev();
        }
    }
    return temp;
}

主な問題は頭と尾をnullとして初期化することに関係していると思いますが、これが問題なのかどうか、また問題がある場合は修正方法がわかりません。NPE を回避するためにこれらのノードを初期化するより良い方法はありますか?

4

1 に答える 1

0

これでリストの先頭と末尾の両方を初期化しています:

MyLinkedList()
{
    this.head = new Node<T>(null, null, null); 
    this.tail = new Node<T>(null, null, null);
    this.size = 0;
}

あなたの反復はいかなる種類のチェックも行わないため、これはあなたのNPEの主な原因のようです。特に、メソッドは境界条件で失敗します (反復を試みる前にすでに長さをチェックしているため)。

いくつかのチェックを追加することで、これらの例外を回避できます。

private Node<T> getNth(int index)
{
    Node<T> temp = null; //Always try to initialize your variables if you're going
                         //to return them.
    if(index < 0 || index > size)
        throw new IndexOutOfBoundsException();

    if(index < this.size() / 2)
    {
        temp = this.head;
        for(int i = 0; i < index; i++)
        {
            if(temp.getNext() != null)
                 temp = temp.getNext();
            else
                 break;//Break the iteration if there is not a next node
        }
    }
    else
    {
        temp = this.tail;
        for(int i = this.size(); i > index; i--)
        {
            if(temp.getPrev() != null)
                temp = temp.getPrev();
            else
                break;
        }
    }
    return temp;
}

必要に応じて、反復を中断する代わりに、何らかの例外をスローできます。

于 2012-10-07T05:24:39.933 に答える