Jack Nicholson
Jack Nicholson

Reputation: 57

Accessing an array of Object References with a variable in java

I am trying to access an object in an array of objects using a variable called molenum. However when I try to run the program I get a Null pointer exception. I am randomly generating molenum and then using that as the index for the array. Any ideas where I'm going wrong?

Here is the code initializing my objects:

    MoleButton[]  molebuttons = new MoleButton[25];
    molebuttons[0] = new MoleButton();
    molebuttons[1] = new MoleButton();
    molebuttons[2] = new MoleButton();
    molebuttons[3] = new MoleButton();
    molebuttons[4] = new MoleButton();
    molebuttons[5] = new MoleButton();
    molebuttons[6] = new MoleButton();
    molebuttons[7] = new MoleButton();
    molebuttons[8] = new MoleButton();
    molebuttons[9] = new MoleButton();
    molebuttons[10] = new MoleButton();
    molebuttons[11] = new MoleButton();
    molebuttons[12] = new MoleButton();
    molebuttons[13] = new MoleButton();
    molebuttons[14] = new MoleButton();
    molebuttons[15] = new MoleButton();
    molebuttons[16] = new MoleButton();
    molebuttons[17] = new MoleButton();
    molebuttons[18] = new MoleButton();
    molebuttons[19] = new MoleButton();
    molebuttons[20] = new MoleButton();
    molebuttons[21] = new MoleButton();
    molebuttons[22] = new MoleButton();
    molebuttons[23] = new MoleButton();
    molebuttons[24] = new MoleButton();


    buttonSpace.add(molebuttons[0]);
    buttonSpace.add(molebuttons[1]);
    buttonSpace.add(molebuttons[2]);
    buttonSpace.add(molebuttons[3]);
    buttonSpace.add(molebuttons[4]);
    buttonSpace.add(molebuttons[5]);
    buttonSpace.add(molebuttons[6]);
    buttonSpace.add(molebuttons[7]);
    buttonSpace.add(molebuttons[8]);
    buttonSpace.add(molebuttons[9]);
    buttonSpace.add(molebuttons[10]);
    buttonSpace.add(molebuttons[11]);
    buttonSpace.add(molebuttons[12]);
    buttonSpace.add(molebuttons[13]);
    buttonSpace.add(molebuttons[14]);
    buttonSpace.add(molebuttons[15]);
    buttonSpace.add(molebuttons[16]);
    buttonSpace.add(molebuttons[17]);
    buttonSpace.add(molebuttons[18]);
    buttonSpace.add(molebuttons[19]);
    buttonSpace.add(molebuttons[20]);
    buttonSpace.add(molebuttons[21]);
    buttonSpace.add(molebuttons[22]);
    buttonSpace.add(molebuttons[23]);
    buttonSpace.add(molebuttons[24]);

Here is where I try to access them through the array.

int molecount = 0;
        int molenum;
        Random rand = new Random();
        int i; //loop counter

        do
        {
            MoleButton.wait(500);
            while(true) {
                molenum = rand.nextInt(25);
                if(molebuttons[molenum].isAMole() == false)
                {
                    molebuttons[molenum].setIsMole(true);
                    break;
                }
            } 

The stack trace is:

Exception in thread "main" java.lang.NullPointerException
    at CW3.MoleButton.main(MoleButton.java:128)

with line 128 being:

if(molebuttons[molenum].isAMole() == false)

Complete source code for the class:

package CW3;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class MoleButton extends ColorButton {

    private Boolean currentlyIsMole;

    public static void main(String[] args)
    {

        //Create GUI
        JFrame guiWindow = new JFrame();
        guiWindow.setVisible(true);
        guiWindow.setTitle("Jack Nicholson");
        guiWindow.setLayout(new BorderLayout());
        guiWindow.pack();

        JPanel topBar = new JPanel();
        JPanel buttonSpace = new JPanel();
        guiWindow.add(topBar,BorderLayout.NORTH);
        guiWindow.add(buttonSpace,BorderLayout.SOUTH);

        //GUI: topbar
        topBar.setLayout(new GridLayout(1,5));

        JLabel label1 = new JLabel();
        JLabel label2 = new JLabel();
        JLabel label3 = new JLabel();
        JLabel label4 = new JLabel();
        JLabel label5 = new JLabel();

        topBar.add(label1);
        topBar.add(label2);
        topBar.add(label3);
        topBar.add(label4);
        topBar.add(label5);

        //GUI:button space
        buttonSpace.setLayout(new GridLayout(5,5));

        MoleButton[]  molebuttons = new MoleButton[25];
        molebuttons[0] = new MoleButton();
        molebuttons[1] = new MoleButton();
        molebuttons[2] = new MoleButton();
        molebuttons[3] = new MoleButton();
        molebuttons[4] = new MoleButton();
        molebuttons[5] = new MoleButton();
        molebuttons[6] = new MoleButton();
        molebuttons[7] = new MoleButton();
        molebuttons[8] = new MoleButton();
        molebuttons[9] = new MoleButton();
        molebuttons[10] = new MoleButton();
        molebuttons[11] = new MoleButton();
        molebuttons[12] = new MoleButton();
        molebuttons[13] = new MoleButton();
        molebuttons[14] = new MoleButton();
        molebuttons[15] = new MoleButton();
        molebuttons[16] = new MoleButton();
        molebuttons[17] = new MoleButton();
        molebuttons[18] = new MoleButton();
        molebuttons[19] = new MoleButton();
        molebuttons[20] = new MoleButton();
        molebuttons[21] = new MoleButton();
        molebuttons[22] = new MoleButton();
        molebuttons[23] = new MoleButton();
        molebuttons[24] = new MoleButton();


        buttonSpace.add(molebuttons[0]);
        buttonSpace.add(molebuttons[1]);
        buttonSpace.add(molebuttons[2]);
        buttonSpace.add(molebuttons[3]);
        buttonSpace.add(molebuttons[4]);
        buttonSpace.add(molebuttons[5]);
        buttonSpace.add(molebuttons[6]);
        buttonSpace.add(molebuttons[7]);
        buttonSpace.add(molebuttons[8]);
        buttonSpace.add(molebuttons[9]);
        buttonSpace.add(molebuttons[10]);
        buttonSpace.add(molebuttons[11]);
        buttonSpace.add(molebuttons[12]);
        buttonSpace.add(molebuttons[13]);
        buttonSpace.add(molebuttons[14]);
        buttonSpace.add(molebuttons[15]);
        buttonSpace.add(molebuttons[16]);
        buttonSpace.add(molebuttons[17]);
        buttonSpace.add(molebuttons[18]);
        buttonSpace.add(molebuttons[19]);
        buttonSpace.add(molebuttons[20]);
        buttonSpace.add(molebuttons[21]);
        buttonSpace.add(molebuttons[22]);
        buttonSpace.add(molebuttons[23]);
        buttonSpace.add(molebuttons[24]);

        //Game loop

        int molecount = 0;
        int molenum;
        Random rand = new Random();
        int i; //loop counter

        do
        {
            MoleButton.wait(500);
            while(true) {
                molenum = rand.nextInt(25);
                if(molebuttons[molenum].isAMole() == false)
                {
                    molebuttons[molenum].setIsMole(true);
                    break;
                }
            }

            //Gameloop:count moles

            for(i=0;i <= 24;i++)
            {
                if(molebuttons[i].isAMole() == true)
                {
                    molecount++;
                }
            }


        }while(molecount <= 8);



    }


    public MoleButton() {
        super(100, 100, Color.RED, 10, Color.BLACK);
        this.addActionListener(new ClickMole(this));
        // Constructor
    }

    public Boolean isAMole()
    {
        return currentlyIsMole;
    }

    public synchronized void setIsMole (Boolean isMole)
    {
        //If true set to mole, if false set to normal button
        if(isMole == true)
        {
            currentlyIsMole = true;
            super.setColor(Color.RED);
        }
        else 
        {
            currentlyIsMole = false;
            super.setColor(Color.GREEN);

        }   
    }

    public static void wait(int milliseconds)
    {
        try
        {
            Thread.sleep(milliseconds);
        }
        catch(InterruptedException e)
        {
            System.out.println(e);
        }
    }

    public class ClickMole implements ActionListener {

        //Event listener for MoleButton

        MoleButton moleB;

        public ClickMole(MoleButton mole)
        {
            moleB = mole;
        }

        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
            if (moleB.currentlyIsMole == true)
                moleB.setIsMole(false);
        }



    }

}

Upvotes: 1

Views: 55

Answers (2)

JP Moresmau
JP Moresmau

Reputation: 7403

When you create an Array in Java, each element is initialized to null. You need to populate the array with instances yourself.

Now that you've added the source code, the issue is with Boolean, that is an object that can be nullable, and is null if not initialized. Java will convert Boolean (objects) to boolean (primitive) automatically, failing if the Boolean is null.

So, change Boolean to boolean everywhere, unless really the fact that it's not initialized is relevant.

Upvotes: 1

Anand Vaidya
Anand Vaidya

Reputation: 1461

I think you have forgot to initialie buttonSpace.. remaining all look good. what line are you getting nullpointer?

Upvotes: 0

Related Questions