我正在尝试制作一个简单的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;
}
}
看看这个代码:
File f = new File(file);
Scanner s = new Scanner (f);
while (s.hasNextLine()){
String line = s.nextLine();
String [] fields = line.split("/n");
...
您正在从文件中获取一行,然后尝试将其拆分为换行符。默认情况下,Scanner#nextLine()
会为您提供从当前位置到下一行的所有内容。在这种情况下,Scanner#nextLine()
返回的String
将永远不会包含换行符,因此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);
啊,问题来了!行中不包含任何换行符,您正试图拆分换行符。