0

My GUI code

package question1;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.border.TitledBorder;


public class DieGUI extends JFrame{

    private JLabel NumberOfSides;
    private JButton Create, RollDie;
    private JTextField EnterSides;
    private JTextArea History;
    private JPanel optionsPan, diePan, HistoryPan, panel;
    private Die dc;
    private int count = 0;

    public DieGUI() {

        //Label created here
        NumberOfSides = new JLabel("Number of side:");

        //Buttons created here
        Create = new JButton("Create");
        Create.addActionListener(new ListenerObject());

        RollDie = new JButton("Roll Current Die");
        RollDie.addActionListener(new ListenerObject());

        //Text Field for sides created
        EnterSides = new JTextField(15);

        //Text Area for history created
        History = new JTextArea(18,22);
        History.setLineWrap(true);
        History.isEditable();
        History.setBorder(new TitledBorder(null, null, TitledBorder.LEADING, TitledBorder.TOP, null, null) );

        //Creating the left biggest panel
        optionsPan = new JPanel();
        optionsPan.setBorder(BorderFactory.createLineBorder(Color.black));

        //Creating smaller left panel
        diePan = new JPanel();
        diePan.setLayout(new FlowLayout());
        diePan.setBorder(new TitledBorder(null, "New Die", TitledBorder.LEADING, TitledBorder.TOP, null, null) );
        diePan.add(NumberOfSides);
        diePan.add(EnterSides);
        diePan.add(Create);

        //Creating right side panel
        HistoryPan = new JPanel();
        HistoryPan.setBorder(new TitledBorder(null, "Roll History", TitledBorder.LEADING, TitledBorder.TOP, null, null) );
        HistoryPan.setLayout(new FlowLayout());
        HistoryPan.add(History);

        //Creating the full panel
        panel = new JPanel();
        panel.setLayout(new GridLayout(2,1));
        panel.setBorder(new TitledBorder(null, "Dice Options", TitledBorder.LEADING, TitledBorder.TOP, null, null) );

        panel.add(diePan);
        panel.add(RollDie);
        setLayout(new GridLayout(1,2));
        add(panel);
        add(HistoryPan);
        //add(new JScrollPane(History));

    }

    public static void main(String[] args) {

        DieGUI gui = new DieGUI();
        gui.setVisible(true);
        gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        gui.setSize(650,350);
        gui.setTitle("Dice GUI");
        gui.setResizable(false);



    }
    public class ListenerObject implements ActionListener{
        public void actionPerformed(ActionEvent event) {
            try {
                if(event.getSource()== Create) {
                    count=0;
                    History.setText("");
                    String text = EnterSides.getText();
                    int sides = Integer.parseInt(text);
                    Die dc = new Die(sides);
                    History.append("Creating a new die deletes the old one \n \n New Die: "+dc+"\n");
                }
                else if(event.getSource()==RollDie) {
                    dc.roll();
                    int value = dc.getSideUp();
                    count++;
                    History.append("Roll # "+count+" => Value: "+value);
                }
            }
            catch(IllegalArgumentException e) {
                History.append("Die must be either 4,6,10,20 or 100 sided \n");
            }
        }
    }
}

Die class we were given

package question1;

public class Die {

    //data fields
    private int numSides;
    private int sideUp;

    /**
     * Unargumented constructor
     */
    public Die() {
        this(6);
    }

    /**
     * Argumented constructor
     * @param numSides number of sides for the Die
     */
    public Die(int numSides) {
        if(numSides == 4 || numSides == 6 || numSides == 10 || numSides == 20 || numSides == 100)
            this.numSides = numSides;
        else
            throw new IllegalArgumentException("Invalid number of sides.");

        roll();
    }

    /**
     * Copy constructor
     * @param in a Die to copy
     */
    public Die(Die in) {
        this.numSides = in.numSides;
        roll();
    }

    /**
     * Change the value of side up, depends on the number of sides
     */
    public void roll() {
        sideUp = (int)(Math.random()*numSides)+1;
    }

    /**
     * Get the side up (showing)
     * @return side up
     */
    public int getSideUp() { roll(); return sideUp; }

    /**
     * Get the number of sides
     * @return number of sides
     */
    public int getNumSides() { return numSides; }

    /**
     * Standard toString for debugging
     */
    public String toString() { return "Die[" + numSides + ", showing: " + sideUp + "]"; }

    /**
     * Standard equals
     */
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Die other = (Die) obj;
        if (numSides != other.numSides)
            return false;
        if (sideUp != other.sideUp)
            return false;
        return true;
    }



}

Error received

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at question1.DieGUI$ListenerObject.actionPerformed(DieGUI.java:96) at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.setPressed(Unknown Source) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEventImpl(Unknown Source) at java.awt.EventQueue.access$500(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue$4.run(Unknown Source) at java.awt.EventQueue$4.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source)

  • The 'Die dc;' field starts as null, and various ways through your code, such as pressing the rolldie button, dereference it, causing your NullPointerException. Either disable all buttons leading to paths where dc can still be null until you are guaranteed that it is not (after the create button is pressed for example), or initialize that dc field in the field decl. – rzwitserloot Mar 21 '20 at 17:31
  • Thank you, I would not have caught that on my own! – Justin Gauthier Mar 21 '20 at 18:03

0 Answers0