#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 всего пару недель, так что это большая помощь!