【发布时间】:2014-04-15 21:08:09
【问题描述】:
我正在尝试制作一个简单的 GUI 应用程序,它接受字符串和按钮并将其保存到文件中。当应用程序加载时,字段将填充文本文件中的值,如下所示:
学校名称
选中的单选按钮
日期
当我更改 GUI 中的值时,它将覆盖文本文件中的上述值。程序通过逐行读取来填充 gui 字段。
因为我现在有我的程序,它得到一个数组索引超出范围异常,它不会将任何内容保存到文件中。
这里是堆栈跟踪:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at prog24178.TestingFiles.<init>(TestingFiles.java:66)
at prog24178.TestingFiles.main(TestingFiles.java:88)
代码如下:
public class TestingFiles extends JFrame {
private JTextField txtCollege;
private JTextField txtDate;
public ArrayList <School> schools;
String file = "c:\\Temp\\schools.txt";
public TestingFiles(){
super("Testing Files");
getContentPane().setLayout(null);
txtCollege = new JTextField();
txtCollege.setBounds(0, 0, 359, 20);
getContentPane().add(txtCollege);
txtCollege.setColumns(10);
JRadioButton selComp = new JRadioButton("Computers");
selComp.setBounds(10, 27, 109, 23);
getContentPane().add(selComp);
JRadioButton selEng = new JRadioButton("Engineering");
selEng.setBounds(139, 27, 109, 23);
getContentPane().add(selEng);
JRadioButton selArt = new JRadioButton("Arts");
selArt.setBounds(281, 27, 78, 23);
getContentPane().add(selArt);
ButtonGroup bg = new ButtonGroup();
bg.add(selArt);bg.add(selEng);bg.add(selComp);
txtDate = new JTextField();
txtDate.setBounds(0, 57, 359, 20);
getContentPane().add(txtDate);
txtDate.setColumns(10);
JButton btnSave = new JButton("Save");
btnSave.setBounds(0, 77, 183, 34);
getContentPane().add(btnSave);
btnSave.addActionListener(new SaveActionHandler());
JButton btnExit = new JButton("Exit");
btnExit.setBounds(183, 77, 176, 34);
getContentPane().add(btnExit);
btnExit.addActionListener(new ExitHandler());
schools = new ArrayList <School>();
try{
File f = new File(file);
Scanner s = new Scanner (f);
while (s.hasNextLine()){
String line = s.nextLine();
String [] fields = line.split("/n");
//schools.add(new School(fields[0], fields[1], fields[2])); ***Array Index out of bounds
}
s.close();
}
catch (IOException ioe){}
}
class SaveActionHandler implements ActionListener {
public void actionPerformed(ActionEvent e) {
schools.add(new School(txtCollege.getText(),txtDate.getText() ));
}
}
class ExitHandler implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
}
public static void main(String[] args) {
TestingFiles app = new TestingFiles();
app.setSize(375,150);
app.setVisible(true);
app.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
}
}
class School {
private String college;
private String field;
private String date;
public School() {};
public School(String college, String field, String date){
this.college = college;
this.field = field;
this.date = date;
}
public String getCollege() {
return college;
}
public String getField() {
return field;
}
public String getDate() {
return date;
}
public void setCollege(String college) {
this.college = college;
}
public void setField(String field) {
this.field = field;
}
public void setDate(String date){
this.date = date;
}
}
【问题讨论】:
-
向我们展示堆栈跟踪。
-
异常在哪里?什么线?我们能看到堆栈跟踪吗?
-
这不是你所说的错误...修复此行:
schools.add(new School(txtCollege.getText(),txtDate.getText() )); -
你可能想学习一些基本的调试。如果您这样做,您将永远不需要再次发布诸如此类的运行时异常。第一步:找到导致错误的代码部分。 (堆栈跟踪有一个行号)。第二步:查看循环边界和您正在循环的数组/列表。其中一个包含错误(例如不正确的大小、硬编码的边界)。你也可以打印一些东西来看看发生了什么。
-
您的第一个问题是使用空布局,您的第二个问题是在 try-catch 块中关闭资源,而不是 finally 块,您的第三个问题是忽略可能引发的异常
标签: java swing file file-io java.util.scanner