【问题标题】:File Writing and Reading not working Java文件写入和读取不起作用Java
【发布时间】:2014-04-15 21:08:09
【问题描述】:

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

【问题讨论】:

  • 向我们展示堆栈跟踪。
  • 异常在哪里?什么线?我们能看到堆栈跟踪吗?
  • 这不是你所说的错误...修复此行:schools.add(new School(txtCollege.getText(),txtDate.getText() ));
  • 你可能想学习一些基本的调试。如果您这样做,您将永远不需要再次发布诸如此类的运行时异常。第一步:找到导致错误的代码部分。 (堆栈跟踪有一个行号)。第二步:查看循环边界和您正在循环的数组/列表。其中一个包含错误(例如不正确的大小、硬编码的边界)。你也可以打印一些东西来看看发生了什么。
  • 您的第一个问题是使用空布局,您的第二个问题是在 try-catch 块中关闭资源,而不是 finally 块,您的第三个问题是忽略可能引发的异常

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


【解决方案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() 默认为您提供从当前位置到下一个换行符的所有内容。在这种情况下,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);

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

【讨论】:

  • 所以我添加了一个打印语句,它将我的整个文件打印为一个。如何按行分隔值?
  • @user3524591 您在 while 循环中添加了一个打印语句,当它打印整个文件时感到惊讶?
  • 那么我从这里去哪里?
  • 我已经尝试在扫描仪中添加一个分隔符来分隔一个新行,但是现在可以了
  • @user3524591 这是一个相当模糊的声明。
猜你喜欢
  • 1970-01-01
  • 2015-05-29
  • 2012-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-20
  • 2013-03-25
相关资源
最近更新 更多