文件写入和读取无法使用Java



我正在尝试制作一个简单的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);

啊,问题来了!行中不包含任何换行符,您正试图拆分换行符。

相关内容

  • 没有找到相关文章

最新更新