2016-02-25 3 views
0

Я читаю файл, используя разделитель со сканером. Когда я добираюсь до последней записи файла, он говорит, что я вне пределов. Если я правильно подсчитаю, я все же в границах.Ошибка при чтении последней записи файла

Вот код, который вызывает ошибку несоответствия ввода. Любая помощь приветствуется. Благодарю.

import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.PrintWriter; 
import java.util.InputMismatchException; 
import java.util.NoSuchElementException; 
import java.util.Scanner; 

public class Test { 
    public static void main(String[] args) throws IOException { 
     String personName = null; 
     double score = 0; 

     File myFile = new File("twogrades.dat"); 

     try { 
      Scanner scan = new Scanner(myFile).useDelimiter(","); 

      while (scan.hasNext()) { 
       personName = scan.next(); 

       for (int i = 0; i <= 5; i++) { 
        score += ((scan.nextDouble()/50) * 0.03); 
       } 

       for (int i = 6; i <= 11; i++) { 
        score += ((scan.nextDouble()/10) * 0.02); 
       } 
       score += ((scan.nextDouble()) * 0.20); 
       score += ((scan.nextDouble()) * 0.50); 

       PrintWriter out = new PrintWriter(new BufferedWriter(
         new FileWriter("grades.dat", true))); 
       out.println(personName + " " + score); 

       out.close(); 
       score = 0; 
       scan.nextLine(); 
      } 

      scan.close(); 
     } catch (InputMismatchException e) { 
      System.out.println(e.getMessage() 
        + " You entered a wrong data type"); 
     } catch (NoSuchElementException e) { 
      System.out.println(e.getMessage() 
        + " There are no more elements left in the file"); 
     } catch (IllegalStateException e) { 
      System.out.println(e.getMessage()); 
     } 
    } 
} 

Вот файл

Yuri Allen,5,26,16,22,18,3,0,4,4,2,10,2,54,89 
+1

могли бы вы также обеспечить ваш 'twogrades.dat' пример файла? – Solorad

+2

Прочитайте и опубликуйте трассировку стека исключения. Используйте свой отладчик. Проверьте и опубликуйте свой входной файл. –

+0

Я не могу воспроизвести эту ошибку с предоставленными вами данными. – Pshemo

ответ

1

Я могу воспроизвести ошибку, но только если есть больше, чем одна строка в файле ввода. Проблема заключается в разделителе. Вы используете только запятую ",". Таким образом, сканер пытается прочитать новый символ линии с последним вводом строки: "89\n". Поскольку это недействительный двойной, вы получаете исключение.

Вы можете решить эту проблему путем добавления новой строки в качестве разделителя: ",|\\r\\n|\\r|\\n"

+0

это сработало, спасибо человеку –

0

я запускаю его и результат: No line found There are no more elements left in the file и выход Yuri Allen 55.398. Возможно, вы можете очистить, восстановить свой проект и изменить:

while (scan.hasNext()) { 

этому

while (scan.hasNextLine()) { 
Смежные вопросы