文件编写和阅读不工作Java

时间:2014-04-15 21:08:10

标签: java swing file file-io java.util.scanner

我正在尝试创建一个简单的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;
    }
}

1 个答案:

答案 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不包含任何换行符,并且您尝试拆分换行符。