2

私は現在、Javaクラスの1つのプログラムに取り組んでおり、ファイルの読み取りで壁にぶつかり続けています。JTableを使用して情報を表示しているので、ファイルから情報を読み取ると、その情報が行に追加されます。空白行がある場合は常に、スキャナーはそれを読み取れず、エラーをスローします。最後のスキャン行でjava.util.NoSuchElementExceptionが発生します!今のところ、私は2つの別々のスキャナーを訴えています。String.splitメソッドを使用しようとしましたが、エラー(ArrayIndexOutOfBoundsException:0)も発生しました。以下に保存方法の読み方を投稿します(2つのスキャナーバージョンと分割の両方)。

private void read(){

    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(); スキャナー=null;

    } 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();
}

これは、レコードに1つの要素がある場合、それらすべてがそこにあることを前提としています。これが保証されない場合は、で各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

最後の行には、「sc.skip( "[\ t] *")など、何にも一致しないパターンを使用することで、NoSuchElementExceptionのリスクを冒さずに何かをスキップできることに注意してください。」

したがって、おそらくループの最初の呼び出しとしてscanner.skip( "[\ t] *);を追加します。

于 2012-04-13T17:33:40.513 に答える