我正在尝试创建一个简单的GUI应用程序,它接受字符串和按钮并将其保存到文件中。当应用程序加载时,将使用文本文件中的值填充字段,如下所示:
学校名称
选定的单选按钮
日期
当我更改GUI中的值时,它将覆盖文本文件中的上述值。该程序通过逐行读取来填充gui字段。
因为我现在有了我的程序,它获得了一个数组索引超出范围的异常,它不会保存任何文件。
这是stacktrace:
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;
}
}
答案 0 :(得分:1)
看看这段代码:
File f = new File(file);
Scanner s = new Scanner (f);
while (s.hasNextLine()){
String line = s.nextLine();
String [] fields = line.split("/n");
...
您从文件中获取一行,然后尝试将其拆分为换行符。默认情况下,Scanner#nextLine()
会为您提供从当前位置到下一个换行符的所有内容。在这种情况下,String
返回的Scanner#nextLine()
将永远不会包含换行符,因此您的fields
数组将只包含一个项目,即整个line
。因此,当您尝试访问fields[1]
时,您将获得例外。
一种简单的方法,你可以自己弄清楚这一点,因为你知道有问题的那条线从那里开始并向后工作来验证你的假设。您应该验证的第一个假设是fields
包含您期望的字段数。
String [] fields = line.split("/n");
System.out.println("fields contains " + fields.length + " items");
那会告诉你fields
只包含一个项目。
下一个要验证的假设是line
实际上包含换行符。
String line = s.nextLine();
System.out.println("Line is " + line);
啊,问题出在那里! line不包含任何换行符,并且您尝试拆分换行符。