Structures
Structures

Reputation: 111

I'm getting two NullPointerExceptions and I'm not sure how to fix

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:

  1. 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)

  2. 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

Answers (2)

Fildor
Fildor

Reputation: 16148

Your temp is null for obvious reasons. Step through it:

  1. Parameterless Constructor -> head.next is null.
  2. 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

Aubin
Aubin

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

Related Questions