NullPointerException when attempting to insert items into array from JDialog box

238 views Asked by At

As it states, when I attempt to insert an item into an object array via my JDialog popup, I get a NullPointerException. I reworked an existing app to create the JDialog, which opens from another application class currently named Project6(). The JDialog class, called ProcessRec(), worked fine when it ran as a standalone GUI(before I made it a JDialog).

My stacktrace is rather unhelpful in this case, as it only points to the method that is attempting to insert data into the array(which, like I said, worked fine before) and the GUI buttons that correspond to them.

The constructor for ProcessRec() accepts a ToolWarehouse() object, which matches the class that creates my object array(which is an array of objects from another class I have defined, ToolItem() ).

public ProcessRec(ToolWarehouse tools)

When it ran on it's own, ProcessRec() constructor params were empty(default).

When ProcessRec() ran as a standalone GUI for inputting data into the array, I would create an object using the default constructor like so:

ToolWareHouse tools = new ToolWarehouse();

and I would then use it's method insert() to enter data into the array.

Now that it is a JDialog, though, I was instructed to change to:

ToolWarehouse tools;

However this causes the NullPointerException because, and i'm guessing, the compiler is pointing to an object that doesn't exist. When I create a new object in ProcessRec(), as I did when it was a standalone, I no longer get this exception. However, when I attempt to store data into the array using insert(), it does not work and the data cannot be found(although I receive a prompt saying the insert was successful).

I know very little about instances of classes, but i'm assuming that the reason my data isn't showing is because it is using a whole different instance of the ToolWarehouse() class? Is the format:

public ProcessRec(ToolWarehouse tools)

accepting the same instance of the class used before? I may be way off base here, so I was hoping someone could help me understand what may be happening and why.

If more info is needed I apologize, i'll add whatever is necessary. The code is somewhat lengthy and I didn't want to take up space. Thanks a ton.

EDIT: Here is the ProcessRec() class, which creates the JDialog box, along with some of the methods corresponding to it's use.

public class ProcessRec extends JDialog
{
     //global declarations
     private JButton insertBtn;
     private JButton deleteBtn;
     private JButton displayBtn;
     private JButton hideBtn;
     private JButton clearBtn;

     private JTextField toolFld;
     private JTextField idFld;
     private JTextField priceFld;
     private JTextField qualityFld;
     private JTextField numInStockFld;
     private JTextField messageFld;

     private JLabel messageLbl;

     private Font f1 = new Font("serif", Font.BOLD, 24);
     private Font f2 = new Font("serif", Font.PLAIN, 18);

     private Container c = getContentPane();

     private String input = "";
     private String toolInput = "";

     private int responseCode = 0;
     private int idInput = 0;
     private int qualityInput = 0;
     private int numInStockInput = 0;

     private double priceInput = 0.0;

     private ToolWarehouse tools = new ToolWarehouse();

    //constructor for GUI elements and event listeners
    public ProcessRec(ToolWarehouse tools)
    {
         setTitle("Project1");
         setSize(520,450);
             c.setLayout(new FlowLayout());

             JLabel title = new JLabel("Tiny Tim's Tool Warehouse, Inc.");
         title.setFont(f1);
         c.add(title);

         JTextField toolLbl = new JTextField("Enter tool name:", 15);
         toolLbl.setEditable(false);
         c.add(toolLbl);

         toolFld = new JTextField(25);
         c.add(toolFld);

         JTextField idLbl = new JTextField("Enter ID:", 15);
         idLbl.setEditable(false);
         c.add(idLbl);

         idFld = new JTextField(25);
         c.add(idFld);

         JTextField priceLbl = new JTextField("Base Price:", 15);
         priceLbl.setEditable(false);
         c.add(priceLbl);

         priceFld = new JTextField(25);
         c.add(priceFld);

         JTextField qualityLbl = new JTextField("Enter Quality:", 15);
         qualityLbl.setEditable(false);
         c.add(qualityLbl);

         qualityFld = new JTextField(25);
         c.add(qualityFld);

         JTextField numInStockLbl = new JTextField("Enter Number in Stock:", 15);
         numInStockLbl.setEditable(false);
         c.add(numInStockLbl);

         numInStockFld = new JTextField(25);
         c.add(numInStockFld);

         insertBtn = new JButton("Insert");
         c.add(insertBtn);

         deleteBtn = new JButton("Delete");
         c.add(deleteBtn);

         displayBtn = new JButton("Display");
         c.add(displayBtn);

         hideBtn = new JButton("Hide");
         c.add(hideBtn);

         clearBtn = new JButton("Clear");
         c.add(clearBtn);

         JLabel messageLbl = new JLabel("Messages:");
         messageLbl.setFont(f2);
         c.add(messageLbl);

         messageFld = new JTextField(30);
         c.add(messageFld);

         //button listeners
         insertBtn.addActionListener(new EventListener());
         deleteBtn.addActionListener(new EventListener());
         displayBtn.addActionListener(new EventListener());
         hideBtn.addActionListener(new EventListener());
         clearBtn.addActionListener(new EventListener());

    } //end constructor  

    public String getToolRecords(int index)
    {
            return tools.getRecord(index);
    }

    public int getNumberOfItems()
    {
            return tools.getNumberOfItems();
    }

//Action Listener 
private class EventListener implements ActionListener
{
    public void actionPerformed(ActionEvent ev)
    {
            if (ev.getSource() == insertBtn)
            {
                toolInput = toolFld.getText();

                input = idFld.getText();
                idInput = Integer.parseInt(input);

                input = priceFld.getText();
                priceInput = Double.parseDouble(input);

                input = qualityFld.getText();
                qualityInput = Integer.parseInt(input);

                input = numInStockFld.getText();
                numInStockInput = Integer.parseInt(input);

                responseCode = tools.insert(qualityInput, toolInput, idInput, numInStockInput,
                                                    priceInput);

                if (responseCode == 1)
                {
                    messageFld.setText(idInput + " - Successful insertion");
                }
                else if (responseCode == 0)
                {
                    messageFld.setText(idInput + " - Array is full");
                }
                else if (responseCode == -1)
                {
                    messageFld.setText(idInput + " - Duplicate/Invalid ID");
                }

                if (tools.getNumberOfItems() < 10)
                {   
                    JOptionPane.showMessageDialog(null, "Tool Name: " + toolInput  
                                + "\nTool ID: " + idInput + "\nTool Base Price: " + "$" + priceInput
                                + "\nQuality: " + qualityInput + "\nNumber In Stock: " 
                                + numInStockInput, "Insert Review", JOptionPane.INFORMATION_MESSAGE);
                }
                else if (tools.getNumberOfItems() == 10)
                {
                    JOptionPane.showMessageDialog(null, "The array is full, please delete an entry",
                                                  "Insert Review", JOptionPane.INFORMATION_MESSAGE);
                }

            }//end insert button

            else if (ev.getSource() == deleteBtn)
            {
                input = idFld.getText();
                idInput = Integer.parseInt(input);

                responseCode = tools.delete(idInput);

                if (responseCode == 1)
                {
                    messageFld.setText(idInput + " - Successful deletion");
                }
                else if (responseCode == -1)
                {
                    messageFld.setText(idInput + " - ID not found");
                }

            }//end delete button

            else if (ev.getSource() == displayBtn)
            {
                tools.display();
            }

            else if (ev.getSource() == hideBtn)
            {
                //setState(JFrame.ICONIFIED);
            }

            else if (ev.getSource() == clearBtn)
            {
                qualityFld.setText(null);
                toolFld.setText(null);
                idFld.setText(null);
                numInStockFld.setText(null);
                priceFld.setText(null);

                messageFld.setText(null);

                repaint();

            }//end clear button

    }//end actionPerformed

}//end ActionListener

}//end Project1

ToolWarehouse class that creates the array:

public class ToolWarehouse
{
    //Global declarations
    private int numberOfItems = 0;
    private int index = 0;
    private int returnCode = 0;

    protected ToolItem[] toolArray = new ToolItem[10];

    public ToolWarehouse()
    {
        numberOfItems = 0;

        //creating the array of ToolItems
        for (int i = 0; i < toolArray.length; i++)
        {
            toolArray[i] = new ToolItem();
            System.out.println(toolArray[i]);
        }

    }//end constructor

    public int searchArray(int id)
    {
        for (index = 0; index < toolArray.length; index++)
        {
            if (toolArray[index].getToolID() == id)
            {
                System.out.println("ID found at location " + index);
                return index;
            }
        }   
        return -1;
    }//end searchArray

    public int insert(int quality, String name, int id, int numInStock, double price)
    {
        returnCode = searchArray(id);

        if (numberOfItems == 10)
        {
            System.out.println("Array is full");
            return 0;
        }
        else if (returnCode == -1)
        {   
            boolean oK = toolArray[numberOfItems].assign(quality, name, id, numInStock, 
                                                            price);
            if (oK == true)
            {
                System.out.println("Successful insertion");
                numberOfItems++;   
                return 1;          
            }
        }
        return -1;

    }//end insert

    public int delete(int ID)
    {
        returnCode = searchArray(ID);   

        if (returnCode != -1)
        {   
            toolArray[returnCode] = new ToolItem();

            for (index = returnCode; index < numberOfItems; index++)
            {
                toolArray[index] = toolArray[index + 1];
            }

            numberOfItems--;
            System.out.println("Successful deletion");
            return 1;
        }
        else
            System.out.println("ID not found");
            return -1;

    }//end delete

    public void display()
    {
        for (index = 0; index < numberOfItems; index++)
        {
            toolArray[index].calcAdjustedPrice();
            toolArray[index].display();
        }
    }//end display

    public String getRecord(int index)
    {
        return "Tool Name:  " + toolArray[index].getName()
                + "| Tool ID:  " + toolArray[index].getToolID()
                + "| Tool Quality:  " + toolArray[index].getQuality()
                + "| Number in Stock:  " + toolArray[index].getNumberInStock()
                + "| Tool Price:  " + toolArray[index].getPrice();

    }//end getRecord

    public int getNumberOfItems()
    {
        return numberOfItems;
    }

}//end ToolWarehouse

And the current portion i'm working on now, which calls insert() from the ToolWarehouse() class, but does not properly insert into the array i'm working on when creating an object of the ToolWarehouse() class using default constructor(even though my println debugging statements indicate it does):

public void readBSAFile() throws IOException, 
                                     FileNotFoundException

    {

        FileInputStream fstream2 = new FileInputStream(filename);
        DataInputStream dstream2 = new DataInputStream(fstream2);

        while (dstream2.available() > 0)
        {
            try
            {
                toolName = dstream2.readUTF();
                id = dstream2.readInt();
                quality = dstream2.readInt();
                numInStock = dstream2.readInt();
                price = dstream2.readDouble();
                dstream2.close();

                System.out.println(toolName);
                System.out.println(id);
                System.out.println(quality);
                System.out.println(numInStock);
                System.out.println(price);

                //tools.insert(quality, toolName, id, numInStock, price);
            }   
            catch (EOFException e)
            {
                System.out.println("End of file reached");
            }
        }
        tools.insert(quality, toolName, id, numInStock, price);
     }//end readBSAFile
1

There are 1 answers

2
Dylan Meeus On

Indeed, you have to make sure the object is initialized before attempting to use it. You put

ToolWarehouse tools; 

as a class variable, and in the dialog method you could say

tools = new ToolWareHouse();

to create the object and start using it. But maybe a better way is to just initialize it as a class variable straight way. e.g write

ToolWarehouse tools = new ToolWareHouse(); 

at the top of the class. (So it's a class variable, and known throughout the whole class)

You didn't show us too much code, so it's hard to tell what the exact problem is. But as you said, you don't initialize your object, so you're bound to get a nullPointerException when trying to pass it on to another method & use it.