一。空指针异常问题
1.在工程中,我定义了几个自定义类的数组,在使用数组前,没有实例化,导致应用数组空指针异常
2.直接使用数组加下标代替引用变量,调用类的方法,而没有将引用变量指向某个对象,也没有实例化,导致变量使用异常
3.原来计划是,在进行空格试探性移动时,将动作保留在Num类中,即保证谁的动作归谁,但是在实现是,出现很多问题,导致很小的程序调试时间很长,最终妥协,使用 了一些面向结构的思想来实现
二。构思程序时,片面的希望能完全是面向对象思想的产物,但是个人能力所累,设计的逻辑有很大漏洞,
本来一个数组就解决的事,却被面向对象所累,好多函数共同作用才实现。
编码习惯也存在很多毛病,switch语句中,case快中没有break;
使用太多while语句,导致多次出现无法跳出循环
变成耦合性太强,不注意降低,编程思路是以功能驱动,导致代码又长又乱,修改很费劲
``
package homework.ai;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Iterator;
import java.util.Vector;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
/*
* 八数码入口
*/
public class EightPuzzle implements ActionListener{
private static int count=0,x=5,y=5; //统计路径输出时已经输出Grid的个数
JFrame frame ;
JPanel jPanel;
JButton ensureButton;
JButton resetButton;
JButton fillButton;
JTextField[][] jTextFields ;
private void initFrame(){
//初始化面板
frame = new JFrame("八数码");
Toolkit tool = frame.getToolkit();
Dimension dimension = tool.getScreenSize();
frame.setBounds( (((int)dimension.getWidth()-200)/2) , (((int)dimension.getHeight()-200)/2) ,200, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//创建布局管理器
GridLayout gridLayout = new GridLayout(4,3);
//初始化面板
jPanel = new JPanel(gridLayout);
frame.add(jPanel);
//在面板中加入文本框,并将文本框保存在一个二维数组中
jTextFields = new JTextField[4][3];
for(int i=0; i<3;i++){
for(int j=0; j<3; j++){
jTextFields[i][j] = new JTextField();
jTextFields[i][j].setFont(new Font("楷体",Font.PLAIN,20));
jPanel.add(jTextFields[i][j]);
}
}//for
ensureButton = new JButton("确定");
ensureButton.addActionListener(this);
resetButton = new JButton("重置");
resetButton.addActionListener(this);
fillButton = new JButton("填充");
fillButton.addActionListener(this);
jPanel.add(ensureButton);
jPanel.add(resetButton);
jPanel.add(fillButton);
frame.setVisible(true);
}//initFrame
//实现按钮监听
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource()==ensureButton){
Num[][] nums = new Num[3][3]; //创建nums数组,放置从屏幕中得到的九个数字
for(int i=0; i<3;i++){
for(int j=0; j<3; j++){
Pattern pattern = Pattern.compile("[1-8]"); //确定每个位置输入的是数字
String str = jTextFields[i][j].getText();
Matcher isNum = pattern.matcher(str);
if( isNum.matches() ){
nums[i][j] = new Num(i, j, Integer.parseInt(str)); //实例化一个Num对象,存入nums数组中
}else{
nums[i][j] = new Num(i, j, 0);
}
}
}//for
//创建第一个八数码对象,深度为1,得到的方式为空,数组信息是从屏幕获得
Grid firstGrid = new