2015-02-15 2 views
0

У меня возникли проблемы с работой моего Scanner. Он основан на примере, который мой учитель дал нам изменить, но я продолжаю получать ошибки, когда я его запускаю. Когда я запускаю его я получаю эту ошибку:Сканер Java: NoSuchElementException

java.util.NoSuchElementException 
at java.util.Scanner.throwFor(Scanner.java:862) 
at java.util.Scanner.next(Scanner.java:1371) 
at ReadDataFile.main(ReadDataFile.java:25) 

Main Class:

/** 
* Write a description of class ReadDataFile here. 
* 
* @author (your name) 
* @version (a version number or a date) 
*/ 
import java.io.FileReader; 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.util.Scanner; 
import java.util.ArrayList; 
public class ReadDataFile { 
    public static void main(String[] args) throws IOException { 

     Scanner sInputFile=null; 
     String FirstName,LastName; 
     Float PayRate, HoursWorked; 

     ArrayList<Employee> Records = new ArrayList<Employee>(); 

     try { 
      sInputFile = new Scanner(new BufferedReader(new FileReader("c:\\temp\\inputData.txt"))); 
      while (sInputFile.hasNextLine()) { 
       FirstName = new String(sInputFile.next()); 
       if(FirstName.length() > 9) 
       FirstName = FirstName.substring(0,8); 
       LastName = new String(sInputFile.next()); 
       if(LastName.length() > 9) 
       LastName = LastName.substring(0,8); 
       PayRate = sInputFile.nextFloat(); 
       HoursWorked = sInputFile.nextFloat(); 
       Employee worker = new Employee(LastName,FirstName,PayRate,HoursWorked); 
       Records.add(worker); 
      } // while 

     } // try 
     catch(Exception IOException) 
     { 
      System.out.println("Unknown file error occurred ..."); 
     } 
     finally { sInputFile.close();} 

     System.out.print("Complete"); 
    } // main 
} // class 

Сотрудник класса:

public class Employee 
{ 
    String LastName, FirstName; 
    float PayRate, HoursWorked, Net, Gross, Tax, TaxRate; 

    public Employee(String LN, String FN, float Rate, float Hours) 
    { 
    LastName = LN; 
    FirstName = FN; 
    PayRate = Rate; 
    HoursWorked = Hours; 
    Gross = PayRate * HoursWorked; 
    Net = Gross * (1-TaxRate); 
    Tax = Gross * TaxRate; 

    } 

    public float getPayRate() 
    { 
     return PayRate; 
    } 
    public float getHoursWorked() 
    { 
     return HoursWorked; 
    } 
    public float getNet() 
    { 
     return Net; 
    } 
    public float getGross() 
    { 
     return Gross; 
    } 
    public String getLastName() 
    { 
     return LastName; 
    } 
    public String getFirstName() 
    { 
     return FirstName; 
    } 
    public float getTax() 
    { 
     return Tax; 
    } 
} 

Вот текст, который я пытаюсь читать:

Doe John 13.00 44.5 
Doe John 13.00 44.5 
Doe John 13.00 44.5 
Doe John 13.00 44.5 
+0

ли файл, который вы пытаетесь прочитать какие-либо данные в нем? 'next' будет читать весь фрагмент данных, не включая символ новой строки, поэтому я ожидаю, что он завершится ошибкой, если все, что у вас есть в файле, является символом новой строки. – Makoto

+3

Где строка 25 в 'ReadDataFile'. Кстати, это может быть более надежным для чтения, а затем разобрать линию как единое целое. – ChiefTwoPencils

+0

Строка 25: FirstName = new String (sInputFile.next()); –

ответ

1

Необходимо позвонить по телефону Scanner.nextLine() в нижней части петли, то есть в этом случае sInputFile.nextLine(). Вы не продвигаетесь к следующей строке, поэтому на этой линии заканчиваются токены.

+0

Я попытался добавить его в конец цикла while, но он говорит: « -статический метод nextLine() не может ссылаться на статический контекст « –

+0

@rcdude Я дал вам имя метода, который вы должны назвать. Он не является статичным, поэтому вы должны называть его на свой экземпляр 'Scanner' *. * – EJP

+0

' Вы не переходите к следующей строке, так что у вас заканчиваются токены в этой строке. Ни '# next', ни' #nextFloat 'заботиться о строках или любом другом символе пробела. Но им все равно, есть ли пустые строки внизу текстового файла. 'sInputFile.hasNextLine()' вернет true здесь, но 'sInputFile.next()' не найдет ничего для чтения, следовательно, исключение. Поэтому я все еще думаю, мой комментарий: «Ваш текстовый файл имеет завершающие пустые строки, удалите их». Возможно, это решение, но я думаю, что OP проигнорировал его? : D – Tom

-3

Это будет работать ..

try { 
     //input File 
     sInputFile = new Scanner(new File("C:/Users/Alex.hp/Desktop/t.txt")); 

     while (sInputFile.hasNextLine()) { //your code 
      FirstName = new String(sInputFile.next()); 
      if(FirstName.length() > 9) 
      FirstName = FirstName.substring(0,8); 
      LastName = new String(sInputFile.next()); 
      if(LastName.length() > 9) 
      LastName = LastName.substring(0,8); 
      PayRate =Float.parseFloat(sInputFile.next()); //edited cause of Exception(InputMismatch Error) 
      HoursWorked =Float.parseFloat(sInputFile.next()); //edited cause of Exception(InputMismatch Error) 
      Employee worker = new Employee(LastName,FirstName,PayRate,HoursWorked); 
      Records.add(worker); 
     } // while 

    }catch(Exception ex){ 
     ex.printStackTrace(); 
    } 

//See the results 
for(int i=0; i<Records.size(); i++) 
     System.out.println(Records.get(i).FirstName+" "+Records.get(i).LastName +" " +Records.get(i).PayRate +" "+Records.get(i).HoursWorked); 

enter image description here

+1

Он не получает «ошибку несоответствия типа», и если бы он был, все это выполнило бы, чтобы изменить его на «NumberFormatException.». – EJP

+0

. Все ваши изменения доказывают, что вы использовали разные входные данные из ОП. И не размещайте фотографии текста здесь, это полная трата всей пропускной способности. – EJP

+0

@ EJP Я использовал Сканер как пользователь, а затем, как показано в моем ответе, и я получил эту ошибку, почему это так странно для вас и почему я лгу? – crAlexander

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