2

我正在制作一个包含向量的双向链接循环列表,但我无法弄清楚如何修复我得到的两个 NullPointerExceptions。它们都与我的 add 方法一起使用,一个 add 方法在列表末尾插入一个对象,另一个在给定索引处插入对象。这是我有问题的代码。

import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.Vector;

public class DList<T> implements ADTListInterface<T> {
private int size;
private int BUCKET;
private DListNode head;
private DListNode last;

public DList() {
    head = new DListNode(null);
    head.next = last;
    head.prev = head;
    BUCKET = 1;
}

public DList(int bucket){
    if (bucket <= 0)
        throw new IllegalArgumentException("Cannot have a bucket lower than 1");

    this.BUCKET = bucket;
    head = new DListNode(null);
    head.next = last;
    head.prev = head;
}

private class DListNode {
    private Vector<T> item;   //Line 29
    private DListNode next;   //Line 30
    private DListNode prev;

    public DListNode(T o) {
        this(o, null, null);
    }

    public DListNode(T o, DListNode next, DListNode prev) {
        item = new Vector<T>(BUCKET);

        item.add(o);
        this.next = next;
        this.prev = prev;
    }

    public void add(T item) {
        if (this.item.size() == this.item.capacity()) {
            DListNode newNode = new DListNode(item, this.next, this);
            this.next = newNode;
        }

        else {
            insertAfter(item);
        }
    }

    public void add(T item, int idx) {
        if (this.item.size() == this.item.capacity()) {
            DListNode newNode = new DListNode(this.item.elementAt(BUCKET), this.next, this);
            this.next = newNode;
        }
        else {
            this.item.add(idx, item);
        }
    }

    public boolean remove(T o){
        if (item.indexOf(o) != -1){
            item.remove(o);
            if (item.size() == 0){
                this.prev.next = this.next;
                this.next.prev = this.prev;
            }
            size--;
            return true;
        }
        return false;
    }

    public void insertAfter(T item) {
        next = new DListNode(item, next, prev);
        next.next.prev = next;
    }

    public DListNode nth(int index) {
        if (index == 1)
            return this;
        else if (index < 0 || next == null) {
            throw new java.util.NoSuchElementException("No Such Element");
        } else
            return next.nth(index - 1);
    }
}

@Override
public void add(T o) {

    DListNode last = head;
    while (last.item.size() >= BUCKET && last.next != head) {
        last = last.next;
    }

    if (last.item.size() == BUCKET) { //Line 102
        DListNode n = new DListNode(o, head, last);
        head.prev.next = n;
        head.prev = n;
        size++;
    } else {
        last.item.add(o);
    }

}

    @Override
public void add(T o, int index) {
    DListNode temp = head, testNext;
    int count = 0;

    while (count+1 <= index) {
        count += temp.item.size();
        temp = temp.next;
        if (temp == head) {
            throw new IndexOutOfBoundsException("Out Of Bounds!");
        }
    }
    testNext = temp.next;   //Line 126
    temp.add(o, index);
    if (testNext != temp.next)
        size++;
}

}

我得到的两个错误是:

  1. 在 DListNodeDriver.main(DListNodeDriver.java:7) 的 DList.add(DList.java:102) 的 DList$DListNode.access$0(DList.java:29) 的线程“main”java.lang.NullPointerException 中的异常

  2. DList$DListNode.access$1(DList.java:30) 处 DListNodeDriver.main(DListNodeDriver.java:6) 处 DList.add(DList.java:126) 处的线程“main”java.lang.NullPointerException 中的异常

    谢谢,任何帮助表示赞赏。

主要方法

import java.util.Iterator;

public class DListNodeDriver {
    public static void main(String[] args) {
        DList<String> students = new DList<String>();
        students.add("Other", 1);
        students.add("New", 3);
        Iterator<String> t = students.iterator();
        while (t.hasNext()) {
            String temp = t.next();
            StdOut.println("Student: " + temp);
        }

    }
}

import java.util.Iterator;

public class DListNodeDriver {
    public static void main(String[] args) {
        DList<String> students = new DList<String>();
        students.add("Other");
        students.add("New");
        Iterator<String> t = students.iterator();
        while (t.hasNext()) {
            String temp = t.next();
            StdOut.println("Student: " + temp);
        }

    }
}
4

2 回答 2

1

temp由于显而易见的原因,您的为空。逐步完成它:

  1. 无参数构造函数 ->head.nextnull.
  2. students.add("other",1);->temp = temp.next在循环中,因此null

类似的问题发生在students.add("other").

根据您的实现,我会做这样的事情:

@Override
public void add(T o, int index) {
    DListNode temp = head
    int count = 0;

    // < instead of <= because if index = size, your temp will be null otherwise.
    // if index = 1 , you'll want to add after head. Watch out for index > size! 
    // It is an IndexOutOfBounds, index = size => add behind last element.
    while (count+1 < index) { 
        count++;
        if( temp.next == null ) { /*Handle that case */ }
        else {temp = temp.next;}
        //if (temp == head) {
        //    throw new IndexOutOfBoundsException("Out Of Bounds!");
        //}
    }
    // temp should now be the element just before the index at which to insert.
    // I'd do a temp.insertAfter( o );

    /* DO YOUR ADDING HERE*/
}
于 2012-10-09T07:25:15.360 回答
0

您知道容器的最大大小并且您自己管理插入,我建议使用 T[] 代替 Vector。您可能会期待更好的性能(无锁)和更明确的错误。

在下面的代码示例中,将 Object 替换为参数化参数 T

http://fr.scribd.com/doc/81926911/37/The-Circular-Linked-List

于 2012-10-09T07:03:05.600 回答