我正在用Java制作一个tic tac toe游戏并制作gui并想运行它来测试它但是我遇到了一些错误。我不确定为什么,并希望有人可以解释为什么会出现这些错误以及我应该怎么做才能解决它们。我得到的错误如下:线程“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.*;
// 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
答案 0 :(得分:4)
堆栈跟踪包含有关导致第{84行显示的NPE
(jbtnReset
)的原因的有用信息。因此,您需要初始化jbtnReset
:
JButton jbtnReset = new JButton("Reset");
实际上同样适用于所有jbtnTicTacToeX
按钮以及jbtnExit
。
方面问题:
使用String#equals
来比较String
内容。 ==
运算符会比较String
个内容。
if (sActionCommand == "Exit") {
应该是
if (sActionCommand.equals("Exit")) {
这将使用此String
检查任何组件的操作命令,因此您要检查特定的源对象:
if (e.getSource() == jbtnExit) {
答案 1 :(得分:1)
你在哪里:
private JButton jbtnExit;
private JButton jbtnReset;
尝试:
private JButton jbtnExit = new JButton("Exit");
private JButton jbtnReset = new JButton("Reset");
答案 2 :(得分:1)
如果查看堆栈跟踪,TicTacToeSwing.java:84
之类的地方会显示错误发生的位置。 TicTacToeSwing.java
是文件,:84
表示行号84。