我得到两个NullPointerExceptions,我不知道如何解决

时间:2012-10-09 06:52:41

标签: java nullpointerexception linked-list doubly-linked-list

我正在创建一个包含向量的双重链接循环列表,我无法弄清楚如何修复我得到的两个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. 线程“main”java.lang.NullPointerException中的异常 在DList $ DListNode.access $ 0(DList.java:29) 在DList.add(DList.java:102) 在DListNodeDriver.main(DListNodeDriver.java:7)

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

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

  3. 主要方法

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

2 个答案:

答案 0 :(得分:1)

由于显而易见的原因,您的temp为空。一步一步:

  1. 无参数构造函数 - &gt; head.nextnull
  2. students.add("other",1); - &gt;循环中的temp = temp.next及其null
  3. 类似的问题发生在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*/
    }
    

答案 1 :(得分:0)

你知道容器的最大尺寸,你自己管理插入,我建议使用T []代替Vector。你可能期望更好的表现(没有锁定)和更明确的错误。

在下面的代码示例中,用参数化参数T

替换Object

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