【问题标题】:Java - Tic Tac Toe Swing game - ErrorsJava - Tic Tac Toe Swing 游戏 - 错误
【发布时间】:2013-04-22 15:53:29
【问题描述】:

我正在用 Java 制作井字游戏并制作了 gui,并想运行它来测试它,但遇到了一些错误。我不知道为什么,希望有人能解释为什么会出现这些错误以及我应该做些什么来解决它们。我得到的错误如下: Exception in thread "main" java.lang.NullPointerException 在 TicTacToeSwing.(TicTacToeSwing.java:84) 在 TicTacToeSwing.main(TicTacToeSwing.java:180)

这是我的代码:(请注意:我还没有完成计算,因为我想先让 gui 运行)如果你知道我应该考虑做的更好的做法,一定要告诉我。

    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.*;

//井字游戏

    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

【问题讨论】:

  • 抛出的异常是哪一行?

标签: java tic-tac-toe


【解决方案1】:

堆栈跟踪包含有关导致NPE 的有用信息(jbtnReset,出现在第 84 行)。因此需要初始化jbtnReset

JButton jbtnReset = new JButton("Reset");    

事实上,这同样适用于所有jbtnTicTacToeX 按钮以及jbtnExit


附带问题: 使用String#equals 比较String 的内容。 == 运算符比较 String 的内容。

if (sActionCommand == "Exit") {

应该是

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

这会检查带有Stringany 组件的操作命令,因此您想改为检查特定的源对象:

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

【讨论】:

  • 第二个旁白句:s/content/references/
  • 我没有投反对票...我想知道为什么有人会自己这样做。无论如何,感谢大家的帮助和投入。我已经清除了除此之外的所有错误:
  • 多个标记只是意味着这条线不止一个问题。重新“可序列化类不声明静态最终”,这是一条警告消息。见this post
【解决方案2】:

如果您查看堆栈跟踪,TicTacToeSwing.java:84 之类的位置会显示错误发生的位置。 TicTacToeSwing.java 是文件,:84 表示第 84 行。

【讨论】:

    【解决方案3】:

    你在哪里:

    private JButton jbtnExit;
    private JButton jbtnReset;
    

    试试:

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

    【讨论】:

    • 我没有否决它...我想知道为什么有人会自己这样做。感谢大家的帮助和投入。我已经清除了除第 24 行之外的所有错误: public class TicTacToeSwing extends JFrame implements ActionListener{ 此行的多个标记 - 可序列化类 TicTacToeSwing 未声明 long 类型的静态最终 serialVersionUID 字段 - 出现“TicTacToeSwing”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    相关资源
    最近更新 更多