1

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



    }

}
2

2 Answers 2

1

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.

Sign up to request clarification or add additional context in comments.

4 Comments

I have initialized these objects earlier on in the function and have even used a function on them all so I'm sure they are initialized. I just edited my post to reflect this.
Is the exception then not in isAMole? Provide the stack trace.
Source code for isAMole()? Maybe it returns a null Boolean (object) instead of a boolean (primitive) and the autoboxing is failing.
@JP is correct. Try using boolean instead of Boolean.
0

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

3 Comments

I have initialized buttonSpace earlier in the function. The buttons appear in the GUI I have created but that specific loop is where I'm having problems.
Can you post the complete main method? I don't see any possible nullpointer here, unless I go through the complete code.
Change private Boolean currentlyIsMole; to private boolean currentlyIsMole; Its problem with AutoBoxing.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.