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



    }

}
  • 1
    Possible duplicate of [What is a Null Pointer Exception, and how do I fix it?](http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-and-how-do-i-fix-it) – radoh Mar 04 '16 at 15:17
  • 1
    On which line do you get the NPE? – bradimus Mar 04 '16 at 15:21

2 Answers2

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.

JP Moresmau
  • 7,388
  • 17
  • 31
0

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

Anand Vaidya
  • 1,374
  • 11
  • 26
  • 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. – Jack Nicholson Mar 04 '16 at 15:27
  • Can you post the complete main method? I don't see any possible nullpointer here, unless I go through the complete code. – Anand Vaidya Mar 04 '16 at 15:42
  • Change private Boolean currentlyIsMole; to private boolean currentlyIsMole; Its problem with AutoBoxing. – Anand Vaidya Mar 04 '16 at 16:11