java.util.NoSuchElementException из неизвестного источника


Я не уверен, почему я получаю эту ошибку. Когда я запускаю свою программу, я получаю это

java.util.NoSuchElementException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextDouble(Unknown Source)

У меня работает только один сканер, и после этого цикла пока он закрыт. Мне было любопытно, если кто-нибудь может дать мне подсказку о том, как я должен пять это. Вот часть кода. Я также сделал комментарий к строке 27, так как именно здесь происходит ошибка, я думаю.

        try {
        File file = new File("src/text.txt");
        File finalGrades = new File("src/nextText.txt");
        PrintWriter output = new PrintWriter(finalGrades);
        File finalGradesReport = new File("src/nextTextReport.txt");
        PrintWriter output2 = new PrintWriter(finalGradesReport);
        Scanner input = new Scanner(file);

        double totalPointsAvailable = input.nextDouble();
        double homeworkWeight = input.nextDouble() / totalPointsAvailable;
        double projectsWeight = input.nextDouble() / totalPointsAvailable;
        double firstExamWeight = input.nextDouble() / totalPointsAvailable;
        double secondExamWeight = input.nextDouble() / totalPointsAvailable;
        double finalExamWeight = input.nextDouble() / totalPointsAvailable;

        int numA = 0, numB = 0, numC = 0, numD = 0, numF = 0, numStudents = 0;
        double totalPercGrades = 0, averageGrades = 0;

        while (input.hasNext()) {
            double hw = input.nextDouble() * homeworkWeight;
            double pw = input.nextDouble() * projectsWeight; //line 27
            double firstEx = input.nextDouble() * firstExamWeight;
            double secondEx = input.nextDouble() * secondExamWeight;
            double finalEx = input.nextDouble() * finalExamWeight;

1 ответ

Ошибка происходит по двум причинам.

  1. Вы не проверяете, достаточно ли ввода, прежде чем звонить на nextDouble(),

  2. hasNext() проверяет следующий токен, но не увеличивается с помощью вызова nextDouble(), Вы хотите использовать hasNextDouble()

Вы должны обернуть nextDouble() в цикле while и использовать счетчик или просто условное выражение перед каждым nextDouble() чтобы убедиться, что в вашем файле есть двойной токен и отслеживать, где вы находитесь в файле

Нечто подобное следует использовать:

//...below Scanner input = new Scanner(file); 
int tokenCounter = 0;

//This will set all of your variables on static fields.
while (input.hasNextDouble()) { /* <-- this wraps your nextDouble() call */
  setVariables(input.nextDouble(), tokenCounter++);
}

//several lines of code later 

public static void setVariables(double inputValue, tokenCounter){

  switch(tokenCounter){
   case 0: totalPointsAvailable = inputValue; break;
   case 1: homeworkWeight = inputValue; break;
   case 2: projectsWeight = inputValue; break;
   //Continue the switch/case based on the expected order of doubles
   //and make your variables static sense they seem changes to your code might
   //cause you to break up your main method and static variables will be easier 
   //to access across different methods.
  } 
}
Другие вопросы по тегам