2

我目前正在为我的一个 java 类编写一个程序,并且我一直在读取文件时遇到墙壁!我正在使用 JTable 来显示信息,因此当从文件中读取信息时,它会被添加到一行中。只要有空白行,扫描仪就无法读取它并抛出错误!我在最后一个扫描线上得到一个 java.util.NoSuchElementException !截至目前,我正在起诉两个单独的扫描仪。我曾尝试使用 String.split 方法,这也给了我一个错误(ArrayIndexOutOfBoundsException:0)。我将在下面发布阅读保存方法(两个扫描仪版本和拆分)。

私人无效读取(){

    try {
        Scanner scanner = new Scanner(new File("games.dat"));


        scanner.useDelimiter(System.getProperty("line.separator"));


        while (scanner.hasNext()) {
      String[] tableRow = new String[6];
            Scanner recIn = new Scanner(record);
            recIn.useDelimiter("\\s*\\|\\s*");
            tableRow[0] = recIn.next();
            tableRow[1] = recIn.next();
            tableRow[2] = recIn.next();
            tableRow[3] = recIn.next();
            tableRow[4] = recIn.next();
            //recIn.next();
            recIn.close();
            model.addRow(new Object[]{tableRow[0],
     tableRow[1], tableRow[2],
     tableRow[3], tableRow[4]});

}scanner.close(); 扫描仪=空;

    } catch (Exception ex) {
        JOptionPane.showConfirmDialog(null, "Could not connect to file! Make sure you are not in        zipped file!",
                "Warning!", JOptionPane.OK_OPTION,
                JOptionPane.ERROR_MESSAGE);
        ex.printStackTrace();

    }
}



private void save() {

    for (int i = 0; i < model.getRowCount(); i++) {


        String data = model.getValueAt(i, 0) + "|" + model.getValueAt(i, 1)
                + "|" + model.getValueAt(i, 2) + "|" + model.getValueAt(i, 3)
                + "|" + model.getValueAt(i, 4) + "|";
        games.add(data);

}

 try {
        for (int i = 0; i < games.size(); i++) {
            fileOut.println(games.get(i));
        }
        fileOut.close();

    } catch (Exception ex) {
        JOptionPane.showConfirmDialog(null, "Could not connect to file! Make sure you are not in zipped file!",
                "Warning!", JOptionPane.OK_OPTION,
                JOptionPane.ERROR_MESSAGE);

    }
}
4

2 回答 2

2

recIn.next();如果该行为空,则将失败,请使用以下命令对其进行保护hasNext()

Scanner recIn = new Scanner(record); 
recIn.useDelimiter("\\s*\\|\\s*");
if (recIn.hasNext()) {
  tableRow[0] = recIn.next(); 
  tableRow[1] = recIn.next(); 
  tableRow[2] = recIn.next(); 
  tableRow[3] = recIn.next(); 
  tableRow[4] = recIn.next();
}

这假设当记录中有一个元素时,所有元素都在那里。如果不能保证这一点,您需要保护每个next()调用,hasNext()并决定当记录中间的元素用完时该怎么办。

此外,您似乎有一个无限循环:

while (scanner.hasNext()) {
  // no calls to scanner.next()
}

你有没有String record = scanner.next();从那个循环的顶部离开?

于 2012-04-13T16:45:07.270 回答
1

从 java.util.Scanner JavaDoc,有这个方法,skip():

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Scanner.html#skip%28java.util.regex.Pattern%29

最后一行内容为:“请注意,可以使用不匹配任何内容的模式跳过某些内容而不会冒 NoSuchElementException 的风险,例如 sc.skip("[ \t]*")。”

因此,也许添加作为循环的第一个调用,scanner.skip("[ \t]*);

于 2012-04-13T17:33:40.513 回答