2016-10-24 2 views
1

Эта программа осуществляет доступ к текстовому файлу с текстовыми элементами, разделенными запятыми. Элементы регистрируются в переменных, которые я создал. За исключением последнего. Затем возникает ошибка. Программа отлично работает с разделителем пробелов по умолчанию для класса сканера (текстовый файл скорректирован с учетом), но не работает, когда я использую запятую в качестве разделителя. Может кто-то, пожалуйста, прокомментировать.Ошибка: NoSuchElementException

Text Data:

smith,john,10 
stiles,pat,12 
mason,emrick,12 

Код:

public void openFile(String f) 
    { 
     try{ 
      x = new Scanner(new File(f)); 
      x.useDelimiter(","); 
     } catch(Exception e){ 
      System.out.println("File could not be found please check filepath"); 
     } 

    } 

public boolean checkNameRoster() 
    { 
     openFile(file); 
     boolean b = false; 
     while(x.hasNext()) 
     { 
      String lName = x.next().trim(); 
      **String fName = x.next().trim();** 
      String grade = x.next().trim(); 
      if(fName.equalsIgnoreCase(firstName) && lName.equalsIgnoreCase(lastName) && grade.equalsIgnoreCase(grade)) 
       { 
        b = true; 
       } 
     } 
     closeFile(); 
     return b; 
    } 

ответ

0

Проблема опирается на тот факт, что вы назвали x.useDelimiter(","); на вашем Scanner в функции openFile().

Поскольку текста данных:

smith,john,10 
stiles,pat,12 
mason,emrick,12 

Scanner видит, как:

"smith,john,10\nstiles,pat,12\nmason,emrick,12" 

Так что же происходит, когда вы выполняете ваш код:

1: x.hasNext() ? Yes 
    x.next().trim() => "smith" 
    x.next().trim() => "john" 
    x.next().trim() => "10\nstiles" 
2: x.hasNext() ? Yes 
    x.next().trim() => "pat" 
    x.next().trim() => "12\nmason" 
    x.next().trim() => "emrick" 
3: x.hasNext() ? Yes 
    x.next().trim() => "12" 
    x.next().trim() => Error! 

Чтобы это исправить вы можете отредактировать файл и изменить все \n с помощью ,, или используйте первый Scanner, чтобы получить все линии, а другой - для получения жетонов, как показано здесь:

public void openFile(String f) 
    { 
     try{ 
      x = new Scanner(new File(f)); // Leave default delimiter 
     } catch(Exception e){ 
      System.out.println("File could not be found please check filepath"); 
     } 

    } 

public boolean checkNameRoster() 
    { 
     openFile(file); 
     boolean b = false; 
     while(x.hasNextLine()) // For each line in your file 
     { 
      Scanner tk = new Scanner(x.nextLine()).useDelimiter(","); // Scan the current line 
      String lName = x.next().trim(); 
      String fName = x.next().trim(); 
      String grade = x.next().trim(); 
      if (fName.equalsIgnoreCase(firstName) && lName.equalsIgnoreCase(lastName) && grade.equalsIgnoreCase(grade)) 
       { 
        b = true; 
       } 
     } 
     closeFile(); 
     return b; 
    }