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 ответ
Ошибка происходит по двум причинам.
Вы не проверяете, достаточно ли ввода, прежде чем звонить на
nextDouble()
,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.
}
}