Reputation: 111
I'm making a doubley linked circular list that holds vectors and I cannot figure out how to fix two NullPointerExceptions that I'm getting. Both of them are with my add methods, one add method inserts an object at the end of the list and the other inserts the object at the given index. Here is my code that is in question.
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++;
}
}
And the two errors that I'm getting are:
Exception in thread "main" java.lang.NullPointerException at DList$DListNode.access$0(DList.java:29) at DList.add(DList.java:102) at DListNodeDriver.main(DListNodeDriver.java:7)
Exception in thread "main" java.lang.NullPointerException at DList$DListNode.access$1(DList.java:30) at DList.add(DList.java:126) at DListNodeDriver.main(DListNodeDriver.java:6)
Thank you, any help is appreciated.
Main Method
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);
}
}
}
Upvotes: 2
Views: 2048
Reputation: 16148
Your temp
is null for obvious reasons. Step through it:
head.next
is null
.students.add("other",1);
-> temp = temp.next
in the loop and therefor null
.Similar problem happens in students.add("other")
.
I would do something like this, based on your implementations:
@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*/
}
Upvotes: 1
Reputation: 14883
You know the max size of the container and you manage yourself the insertion, I suggest to use T[] in place of Vector. You may expect better performances (no lock) and more explicit errors.
In the code sample below, replace Object by parametrized argument T
http://fr.scribd.com/doc/81926911/37/The-Circular-Linked-List
Upvotes: 0