Сканер не позволит мне продолжить работу после исправления неверного ответа

#java #testing #input #output #java.util.scanner

#java #тестирование #ввод #вывод #java.util.scanner

Вопрос:

Итак, я написал тестовый класс для тестирования программы, которая позволит мне принять количество курсов, буквенных оценок и кредитов курса, а затем рассчитать общее количество взвешенных баллов, общее количество кредитов и средний балл в цикле, рассчитанном максимум на 3 курса.

Однако мне нужно проверить количество курсов и доказать, что он будет запущен после ввода как недопустимых, так и допустимых входных данных.

Я получил его так, что после неверного ответа пользователю будет предложено ввести допустимое количество курсов, но как только вводится допустимый ответ, программа просто останавливается, а не запускается, как предполагалось. Кто-нибудь может сказать мне, почему?

Вот мой код:

 import java.util.*;
import java.lang.*;

public class ComputeGpa
{ 
   public static void main(String [] args)
   {
      Gpa grades1 = new Gpa();

      Scanner in = new Scanner (System.in);

      System.out.println("Enter number of courses: ");
      int courses = in.nextInt();
      if(courses > 0)
      {
        int i = 0;
        while(i < 3)
        {  
           System.out.println("Please enter a letter grade.");
           String letter = in.next();
           char result = letter.charAt(0);

           System.out.println("How many credits was this class worth?");
           int credits = in.nextInt();

           grades1.addToTotals(result, credits);
           i  ;
        }
        System.out.printf("GPA: %.2f", grades1.calcGpa());
      }
      else
      {
        System.out.println("Number of courses must be greater than 0. Please enter a valid number of courses.");
        courses = in.nextInt();
      }        
    }
} 
 

Вывод для этого следующий:

 Enter number of courses: 
-2
Number of courses must be greater than 0. Please enter a valid number of courses.
3
 

И затем программа перестает работать. Где я ошибаюсь? Я думал, что in.next() в строке с буквой решит эту проблему, но, видимо, я ошибался. Есть идеи?

Комментарии:

1. Это то, где у вас есть цикл.

Ответ №1:

В настоящее время ваш поток — if / else .

 int foo = ...;
if(foo > 0) {
    //your grade stuff
}
else {
    //ask for reinput
}
 

В итоге происходит то, что вы один раз перехватываете проблемный ввод, но никогда не даете вашему потоку возможность проверить его снова.

Вместо этого используйте while цикл над if/else макетом, чтобы принудительно выполнить повторный ввод, пока не получите точную информацию, которую вы хотите, затем продолжайте.

 System.out.println("Enter number of courses: ");
int courses = in.nextInt();
while(courses < 0) {
    System.out.println("Number of courses must be greater than 0. Please enter a valid number of courses.");
    courses = in.nextInt();
}

int i = 0; 
//...
 

Комментарии:

1. Спасибо! Я не понимал, что он не вернется к началу, если после неправильного ответа. Я кодирую Java всего пару недель, так что это большая помощь!