2012-04-13 4 views
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(); сканер = 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); 

    } 
} 

ответ

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(); из верхней части этого цикла?

+0

да, я извиняюсь я забыл включить эту строку кода в моей должности –

+0

я вы сделали то, что вы предложили, и теперь это работает !, но теперь, когда в поле с разделителями нет ничего, он будет печатать нуль в таблице –

+0

. put 'model.addRow (новый объект [] {tableRow [0], tableRow [1] , tableRow [2], tableRow [3], tableRow [4]}); 'внутри тела защитного' if', поэтому вы только добавляете значения в таблицу, если сможете их проанализировать (обратите внимание: вызов ' recIn.close() 'должен находиться вне' if': вы хотите закрыть его, можете ли вы его прочитать или нет). Кроме того, если это решило ваш вопрос, пожалуйста, примите мой ответ. – Attila

1

Из JavaDoc java.util.Scanner есть этот метод, пропустите():

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 ("[\ т] *);

Смежные вопросы