文件写入和读取不工作的Java

文件写入和读取不工作的Java,java,swing,file,file-io,java.util.scanner,Java,Swing,File,File Io,Java.util.scanner,我正在尝试制作一个简单的GUI应用程序,它接受字符串和按钮并将其保存到文件中。加载应用程序时,字段将填充文本文件中的值,如下所示: 学校名称 所选单选按钮 日期 当我更改GUI中的值时,它将覆盖文本文件中的上述值。程序通过逐行读取来填充gui字段 因为我现在有了我的程序,所以它会得到一个数组索引越界异常,并且它不会将任何内容保存到文件中 以下是stacktrace: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsExcep

我正在尝试制作一个简单的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)
线程“main”java.lang.ArrayIndexOutOfBoundsException中的异常:1 位于prog24178.TestingFiles。(TestingFiles.java:66) 位于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;
    }
}
公共类测试文件扩展JFrame{
私立JTextField txtfield学院;
私有JTextField txtDate;
公立学校;
String file=“c:\\Temp\\schools.txt”;
公共测试文件(){
超级(“测试文件”);
getContentPane().setLayout(null);
txtCollege=newjtextfield();
txtCollege.setBounds(0,0359,20);
getContentPane().add(txtCollege);
TXT学院设置栏目(10);
JRadioButton selComp=新的JRadioButton(“计算机”);
selComp.挫折(10,27,109,23);
getContentPane().add(selComp);
JRadioButton selEng=新的JRadioButton(“工程”);
(139,27,109,23);
getContentPane().add(selEng);
JRadioButton selArt=新JRadioButton(“艺术”);
塞尔亚特.挫折(281,27,78,23);
getContentPane().add(selArt);
ButtonGroup bg=新建ButtonGroup();
背景添加(selArt);背景添加(selEng);背景添加(selComp);
txtDate=新的JTextField();
txtDate.setBounds(0,57,359,20);
getContentPane().add(txtDate);
txtDate.setColumns(10);
JButton btnSave=新JButton(“保存”);
btnSave.backbounds(0,77,183,34);
getContentPane().add(btnSave);
addActionListener(新的SaveActionHandler());
JButton btnExit=新JButton(“退出”);
btnExit.setBounds(183,77,176,34);
getContentPane().add(btnExit);
addActionListener(新的ExitHandler());
学校=新ArrayList();
试一试{
文件f=新文件(文件);
扫描器s=新扫描器(f);
而(s.hasNextLine()){
字符串行=s.nextLine();
String[]fields=line.split(“/n”);
//添加(新学校(字段[0],字段[1],字段[2]);***数组索引超出范围
}
s、 close();
}
捕获(ioe异常ioe){}
}
类SaveActionHandler实现ActionListener{
已执行的公共无效操作(操作事件e){
schools.add(新学校(txtCollege.getText(),txtDate.getText());
}       
}
类ExitHandler实现ActionListener{
@凌驾
已执行的公共无效操作(操作事件e){
系统出口(0);
}       
}
公共静态void main(字符串[]args){
TestingFiles app=新建TestingFiles();
应用程序设置尺寸(375150);
app.setVisible(真);
应用程序setDefaultCloseOperation(关闭时处理);
}
}
班级学校{
私立弦乐学院;
私有字符串字段;
私有字符串日期;
公立学校{};
公立学校(字符串学院、字符串字段、字符串日期){
这个学院=学院;
this.field=字段;
this.date=日期;
}
公共学院(){
返回学院;
}
公共字符串getField(){
返回字段;
}
公共字符串getDate(){
返回日期;
}
公立学院(弦学院){
这个学院=学院;
}
公共无效设置字段(字符串字段){
this.field=字段;
}
公共无效设置日期(字符串日期){
this.date=日期;
}
}
看看这个代码:

File f = new File(file);
Scanner s = new Scanner (f);
while (s.hasNextLine()){
    String line  = s.nextLine();
    String [] fields = line.split("/n");
...
您从文件中获取一行,然后尝试在换行符上拆分它<默认情况下,代码>扫描仪#nextLine()提供从当前位置到下一换行的所有信息。在这种情况下,
扫描器#nextLine()
返回的
字符串将永远不会包含换行符,因此
字段
数组将只包含一项,即整个
。因此,当您尝试访问
字段[1]
时,会出现异常

一个简单的方法是,你可以自己解决这个问题,因为你知道有问题的那一行从那里开始,然后反向工作来验证你的假设。您应该验证的第一个假设是
字段
包含您期望的字段数

String [] fields = line.split("/n");
System.out.println("fields contains " + fields.length + " items");
这会告诉您,
字段
只包含一项

要验证的下一个假设是
line
实际上包含换行符

String line  = s.nextLine();
System.out.println("Line is " + line);

啊,有问题了!行不包含任何换行符,您正在尝试在换行符上拆分。

显示堆栈跟踪。例外情况在哪里?什么线路?我们能看到堆栈跟踪吗?那不是你说的错误。。。修正这一行:
schools.add(新学校(txtCollege.getText(),txtDate.getText())您可能想学习一些基本的调试。如果您这样做了,您就再也不需要发布类似于此的运行时异常了。第一步:找到导致错误的代码部分。(堆栈跟踪具有行号)。第二步:查看循环边界和正在循环的数组/列表。其中一个包含错误(例如大小不正确、硬编码边界)。您还可以打印一些内容来查看发生了什么。第一个问题是使用空布局,第二个问题是关闭try-catch块中的资源,而不是finally块,第三个问题是忽略except
String line  = s.nextLine();
System.out.println("Line is " + line);