Java - Tic Tac Toe Swing game - Errors

2019-09-20 18:06发布

问题:

I am making a tic tac toe game in Java and made the gui and wanted to run it to test it but am getting a few errors. I am not sure why and was hoping that someone could explain why those errors are coming up and what i should do to fix them. The errors that I am getting are as follows: Exception in thread "main" java.lang.NullPointerException at TicTacToeSwing.(TicTacToeSwing.java:84) at TicTacToeSwing.main(TicTacToeSwing.java:180)

Here is my code: (please note: I have not done the calculations yet because I wanted to get the gui going first) If you know of a better practice that I should consider doing, by all means, let me know.

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Container;
    import java.awt.GridLayout;
    import java.awt.event.ActionListener;

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

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

//Tic Tac Toe

    public class TicTacToeSwing extends JFrame
    implements ActionListener { 

//JButtons

//private JButton button1 = new JButton("");    
private JButton jbtnTicTacToe1;
private JButton jbtnTicTacToe2;
private JButton jbtnTicTacToe3;
private JButton jbtnTicTacToe4;
private JButton jbtnTicTacToe5;
private JButton jbtnTicTacToe6;
private JButton jbtnTicTacToe7;
private JButton jbtnTicTacToe8;
private JButton jbtnTicTacToe9;

private JButton jbtnExit;
private JButton jbtnReset;

//JFrame window = new JFrame("Tic-Tac-Toe Swing ");
private JFrame window = new JFrame("Tic-Tac-Toe");


//labels
private JLabel jlblPlayerX = new JLabel ("X");
private JLabel jlblPlayerO = new JLabel ("O");

//text fields
JTextField jtfName = new JTextField(20);
private JTextField jtfPlayerX = new JTextField("X");
private JTextField jtfPlayerO = new JTextField("O");

//Panels
JPanel jpnlMain = new JPanel ();
    JPanel jpnlFamily = new JPanel();
    JPanel jpnlNorth = new JPanel();
    JPanel jpnlSouth = new JPanel();
    JPanel jpnlCenter = new JPanel();
    JPanel jpnlTop = new JPanel();
    JPanel jpnlBottom = new JPanel();

//Class Constructor
public TicTacToeSwing () {

    //Prepare JFrame/Window
    super ("Tic Tac Toe");
    setSize(400,400);
    setTitle("Tic Tac Toe Swing");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    //Set the layouts for 3 rows and 3 columns
    jpnlMain.setLayout(new BorderLayout(3,3));
    jpnlCenter.setLayout(new GridLayout());
    jpnlSouth.setLayout(new GridLayout());
    jpnlTop.setLayout(new BorderLayout());
    jpnlBottom.setLayout(new BorderLayout());

    //Center Panel
    jpnlCenter.add(jlblPlayerX);
    jpnlCenter.add(jlblPlayerO);

    //identify each JButton
    jbtnReset.setActionCommand("Reset");
    jbtnExit.setActionCommand("Exit");

    //register JButton for event handling by using the THIS keyword - THIS class will handle the events
    jbtnReset.addActionListener(this);
    jbtnExit.addActionListener(this);

    /*Add Buttons To The Window*/
    window.add(jbtnTicTacToe1);
    window.add(jbtnTicTacToe2);
    window.add(jbtnTicTacToe3);
    window.add(jbtnTicTacToe4);
    window.add(jbtnTicTacToe5);
    window.add(jbtnTicTacToe6);
    window.add(jbtnTicTacToe7);
    window.add(jbtnTicTacToe8);
    window.add(jbtnTicTacToe9);

    /*Add The Action Listener To The Buttons
    button1.addActionListener(this);
    button2.addActionListener(this);
    button3.addActionListener(this);
    button4.addActionListener(this);
    button5.addActionListener(this);
    button6.addActionListener(this);
    button7.addActionListener(this);
    button8.addActionListener(this);
    button9.addActionListener(this);
    */

    jbtnTicTacToe1.addActionListener(this);
    jbtnTicTacToe2.addActionListener(this);
    jbtnTicTacToe3.addActionListener(this);
    jbtnTicTacToe4.addActionListener(this);
    jbtnTicTacToe5.addActionListener(this);
    jbtnTicTacToe6.addActionListener(this);
    jbtnTicTacToe7.addActionListener(this);
    jbtnTicTacToe8.addActionListener(this);
    jbtnTicTacToe9.addActionListener(this);

    //South Button Panel
    jpnlSouth.add(jbtnReset);
    jpnlSouth.add(jbtnExit);

    /* Instantiate JButtons, put into a method for efficiency
    jbtn1 = instantiateJButton("1", Color.PINK);
    jbtn2 = instantiateJButton("2", Color.PINK);
    jbtn3 = instantiateJButton("3", Color.PINK);
    jbtn4 = instantiateJButton("4", Color.PINK);
    jbtn5 = instantiateJButton("5", Color.PINK);
    jbtn6 = instantiateJButton("6", Color.PINK);
    jbtn7 = instantiateJButton("7", Color.PINK);
    jbtn8 = instantiateJButton("8", Color.PINK);
    jbtn9 = instantiateJButton("9", Color.PINK);
    */

    //Finalize screen layout and publish to the display
    jpnlMain.add(jpnlCenter, BorderLayout.NORTH);
    jpnlMain.add(jpnlSouth, BorderLayout.CENTER);

    //Prepare the container
    Container ca = getContentPane();
    ca.setBackground (Color.LIGHT_GRAY);
    ca.add(jpnlMain);
    setContentPane (ca);

    setVisible(true);
    //end constructor       
}

//CLASS EVENT HANDLER
public void actionPerformed(java.awt.event.ActionEvent e)
{
    //find out which JButton was pressed by using the Action Command
    String sActionCommand = e.getActionCommand();

    //EXIT JButton
    if (sActionCommand == "Exit")
    {
        System.exit(0);
    }

    //RESET JButton
    else if (sActionCommand == "Reset")
    {
        jtfPlayerX.setText("");
        jtfPlayerO.setText("");
    }
}   //end ACTIONPERFORMED (java.awt.event.ActionEvent e)

/**
 * @param args
 */
public static void main(String[] args) {
    //EXECUTION STARTING POINT

    TicTacToeSwing TicTacToeSwing = new TicTacToeSwing();

    //TicTacToeSwing TicTacToeObject = new TicTacToeSwing();

}//end main(String[] args)

   }//end TicTacToeSwing class

回答1:

The stacktrace has useful information about what is causing the NPE (jbtnReset which appears on line 84). Therefore you need to initialize jbtnReset:

JButton jbtnReset = new JButton("Reset");    

In fact the same applys to all the jbtnTicTacToeX buttons as well as jbtnExit.


Side issues: Use String#equals to compare String content. The == operator compares String content.

if (sActionCommand == "Exit") {

should be

if (sActionCommand.equals("Exit")) {

This checks the action command for any component with this String so you want to check the specific source object instead:

if (e.getSource() == jbtnExit) {


回答2:

If you look at the stack trace, places like TicTacToeSwing.java:84 show you where the errors are occuring. TicTacToeSwing.java is the file, and :84 means line number 84.



回答3:

Where you have:

private JButton jbtnExit;
private JButton jbtnReset;

Try:

private JButton jbtnExit = new JButton("Exit"); 
private JButton jbtnReset = new JButton("Reset");