Ошибка при попытке преобразовать строку в целое число с помощью Integer.parseInt()

*** Обновляю свой пост, чтобы показать весь мой код, надеюсь, это даст больше контекста.

Когда я запускаю программу, она пропускает мой первый оператор if и выдает ошибку.***

Я получаю сообщение об ошибке Exception in thread "main" java.lang.NumberFormatException: For input string: ""

Я пытаюсь преобразовать строковую переменную в int в первом операторе else цикла while... Ошибка возникает в int examScore = Integer.parseInt(userInput).

   import java.util.Scanner;//imports scanner

   public class ExamScoresCalculator{

   public static void main(String[] args){



   Scanner scan = new Scanner(System.in);//creates new scanner object 

   //prompts user for lowest possible exam score
   System.out.println("Enter the lowest possible value for the exam: ");
   int lowRange = scan.nextInt();

   //prompts user for highest possible exam score
   System.out.println("Enter the highest possible value for the exam: ");
   int highRange = scan.nextInt();

   boolean flag = true; //while loop flag
   double lowestExamScore = highRange; // holds lowest score
   double highestExamScore = lowRange; //holds highest score
   double totalPoints = 0; //holds sum of all scores entered
   int totalExams = 0; //holds the total number of exams entered by the user

   while (flag == true){
      System.out.println("Enter an exam score between " + lowRange + " and " + highRange + " or type exit. "); //asks user for an exam score within correct range     
      String userInput = scan.nextLine();

      if ((userInput.equals("exit")) || (userInput.equals("Exit")) || (userInput.equals("EXIT"))){ //checks if user enters "exit"
         flag = false; //ends while loop

      }else{      
         int examScore = Integer.parseInt(userInput); //converts user input into integer 

         if (examScore >= lowRange && examScore <= highRange){ //checks if user entered a correct test score
            totalExams += 1; //increments totalExams by 1
            totalPoints += examScore; //adds examScore total to totalPoints

            if (examScore < lowestExamScore){ //checks if the exam score entered is the lowest 
               lowestExamScore = examScore; //updates lowestExamScore variable 
            }

            else if (examScore > highestExamScore){ //checks if exam score entered is the highest 
               highestExamScore = examScore; //updates highestExamScore variable 
            }

         }else{
            System.out.println("Please enter a correct score."); //asks user to enter a correct score 
         }

      }


   }//closing while loop 

   //prints the total number of exams, lowest score, highest score, and average score to screen 
   System.out.println("Total number of exams: " + totalExams);
   System.out.println("Lowest exam score: " + lowestExamScore);
   System.out.println("Highest exam score: " + highestExamScore);
   System.out.println("Average exam score: " + (totalPoints / totalExams)); 

   }//closing main 
   }//closing class



person znelson240    schedule 20.10.2019    source источник
comment
если вы укажете любое другое значение, кроме цифр, вы получите эту ошибку, так как вы конвертируете в целое число, верно?   -  person Ganesa Vijayakumar    schedule 20.10.2019
comment
Не имеет отношения, но while (flag = true) не делает то, что вы хотите.   -  person Joseph Sible-Reinstate Monica    schedule 20.10.2019
comment
Также не связано, вы не обрабатываете eXit, eXit, eXIT или ExIT (и еще несколько перестановок!) if (userInput.equalsIgnoreCase("exit"))   -  person Elliott Frisch    schedule 20.10.2019
comment
Вы должны ввести данные в командной строке. Если вы просто нажмете ввод, это будет "" (пустая строка), и вы получите сообщение об ошибке (исключение). Integer.parseInt необходимо указать целое число в виде строки, например. 42.   -  person Stefan Zhelyazkov    schedule 20.10.2019
comment
Я понимаю, что мне нужно ввести данные в командной строке, но когда я запускаю программу, она сразу выдает ошибку. Кажется, что он пропускает оператор if и переходит прямо к оператору else...   -  person znelson240    schedule 20.10.2019
comment
Я думаю, ваш код будет работать, если вы наберете число, а затем Enter. Если вы дважды нажмете Enter, вы получите исключение, потому что ввод будет . Но вы должны исправить ошибки, как указано в комментариях выше.   -  person CocoNess    schedule 20.10.2019
comment
CocoNess, согласен. Я только что обновил свой пост, чтобы показать остальную часть моего кода, чтобы показать, с чем я работаю.   -  person znelson240    schedule 20.10.2019


Ответы (3)


Как только вы нажимаете ENTER для ввода наивысшего балла, сканер считывает целое число (nextInt), а также считывает конец строки (nextLine) . Поскольку в строке не представлен текст, она читается как пустая строка "".

Вы должны заменить scan.nextInt на scan.nextLine в коде. Он должен нормально работать с приведенными ниже изменениями.

//prompts user for lowest possible exam score
  System.out.println("Enter the lowest possible value for the exam: ");
   int lowRange = Integer.parseInt(scan.nextLine());

   //prompts user for highest possible exam score
System.out.println("Enter the highest possible value for the exam: ");
   int highRange = Integer.parseInt(scan.nextLine());
person javaGroup456    schedule 20.10.2019
comment
Спасибо за объяснение. Это имеет для меня гораздо больше смысла. - person znelson240; 20.10.2019

Пожалуйста, используйте два входа для userInput и examScore, которые решат вашу проблему, поскольку вы не можете использовать одно значение для обоих типов данных String и Integer.

(но это возможно, когда ваше входное значение равно «123» (только цифры), даже это также не применимо для вашей программы)

person Ganesa Vijayakumar    schedule 20.10.2019
comment
Этот ответ неверен. Можно использовать одно значение для типов данных String и Integer. - person CocoNess; 20.10.2019
comment
@CocoNess, кажется, описание вопроса обновилось после моего ответа. в любом случае, не могли бы вы объяснить, как мы можем использовать одно входное значение как в виде строки, так и в виде целого числа. (пожалуйста, обратите внимание на цитируемый абзац и в моем разделе) - person Ganesa Vijayakumar; 20.10.2019

Добавьте scan.nextLine(), чтобы переместить сканер для чтения следующей строки (новой строки).

System.out.println("Enter the highest possible value for the exam: ");
int highRange = scan.nextInt();
scan.nextLine();   // Add this line 
person CocoNess    schedule 20.10.2019
comment
Первые два входа scan.nextLine() для получения наивысших и наименьших возможных оценок работают нормально. Строка userInput = nextLine() выдает ошибку, когда я пытаюсь преобразовать ее в int с помощью int examScore = Integer.parseInt(userInput) - person znelson240; 20.10.2019
comment
Я скопировал код в свою IDE, и он работает правильно, когда scan.nextLine() добавляется после ввода highRange. - person CocoNess; 20.10.2019
comment
nextInt не переводит сканер на следующую строку. Сначала сканер должен быть переведен на следующую строку, затем вы можете использовать nextLine - person CocoNess; 20.10.2019