views:

226

answers:

4

I attempted to adapt a class I had found on the web for a dynamic array of ints for a dynamic array of "Entities," but now I am getting a "NullPointerException."

The code raising the exception is:

public void initialize()
{
    buffer = new BufferedImage(800,600,BufferedImage.TYPE_INT_RGB);
    Entities.put(Entities.getCurrentPos()+1, new Entity(100, 100, Color.green));
    Entities.put(Entities.getCurrentPos()+1, new Entity(400, 400, Color.blue));
}

The relevant parts of DynArrayEntities class:

...

private Entity[] data;  // An array to hold the data.
private int currentpos = 0;

...

public void put(int position, Entity value) {

    if (position >= data.length) {

        int newSize = 2 * data.length;
            if (position >= newSize)
                newSize = 2 * position;
        Entity[] newData = new Entity[newSize];
        System.arraycopy(data, 0, newData, 0, data.length);
        data = newData;
    }

    data[position] = value;
    currentpos++;

}

....

public int getCurrentPos() {
    return currentpos;
}

Thanks in advance for your help!

+3  A: 
...

private Entity[] data= new Entity[0];  // Or some value > 0
...

otherwise data is null the first time you access it in the method.

Carsten
It would be typical for an implementation like this to include a constructor with a "capacity" argument to determine the initial size of the array. See Java's ArrayList class.
Tim Bender
Yep, it appears I didn't initialize the array properly. Thanks!
Jonathan Chan
+2  A: 

you're doing

position >= data.length

before initializing data

f4
Yep, you and Carsten both spotted the same mistake of mine. Thanks!
Jonathan Chan
A: 

(Is Entities a field? In that case you should call it entities. See http://java.sun.com/docs/codeconv/)

You should tell exactly that on which line the NPE is thrown. If it's in the initialize() method's second line, then probably the Entities field is null. If it's in the put() method, then probably it's because the data field is null.

Esko Luontola
Sorry for not being clear about the error. Thanks for your help!
Jonathan Chan
A: 

Are you doing this just as a learning exercise? If not, why not use java.util.Vector, which provides a dynamic array for any Object?

Eric Warmenhoven
I see! I guess I'll use a Vector to hold all the Entities.
Jonathan Chan