Проверка ввода с помощью Java

Я ноб, поэтому прошу прощения, если я задаю глупый вопрос. Я прошу пользователя ввести числовое значение. Если значение меньше 12 или не численное значение, такое как число, я хочу, чтобы он запрашивал их для другого ввода. Когда вводится значение не менее 12, я хочу, чтобы это значение присваивалось переменной с именем creditUnits;

Когда я запрашиваю начальное приглашение, моя программа поймает его, если введенное значение не является числовым, оно попросит пользователя ввести "Действительный номер:". Кажется, что цикл while работает хорошо.

У меня возникла проблема со вторым циклом, где предполагается, что любое число, введенное в нем, будет меньше 12. Оно попросит пользователя ввести значение больше 11. Проблема, с которой я сталкиваюсь, находится в этот момент, если пользователь вводит какое-либо значение в этот момент, программа просто сидит там. Любая помощь будет оценена, и я заранее извиняюсь за небрежность моего кода:

System.out.print("Enter the credits you will take each term: ");
while (!in.*************()){
 System.out.print("Enter a valid number: ");
 in.next();
}
creditUnits = in.**********();
if (creditUnits < 12){
 System.out.print("Enter a number greater than 11: ");
 in.next();
}
creditUnits = in.**********(); 
System.out.println("You will be taking " + creditUnits + " credits per term.");
2 ответа

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

System.out.print("Enter the credits you will take each term: ");
while (!in.*************()){
 System.out.print("Enter a valid number: ");
 in.next();
}
creditUnits = in.**********();
if (creditUnits < 12){
 System.out.print("Enter a number greater than 11: ");
 creditUnits = in.**********(); 
}
System.out.println("You will be taking " + creditUnits + " credits per term.")

Кроме того, вы должны подумать о том, чтобы положить блок if(creditUnits < 12) в цикл while, так что вы можете постоянно проверять, ввели ли они число больше 12.

Что-то вроде:

System.out.print("Enter the credits you will take each term: ");
while (true){
 System.out.print("Enter a valid number: ");
 creditUnits = in.**********();
 if (creditUnits < 12){
 System.out.print("\nNumber must be greater than 12!\n"); 
 }else
 break;
}
System.out.println("You will be taking " + creditUnits + " credits per term.");

Кроме того, нет такого понятия, как глупый вопрос. Только глупые фанаты./Шутка


Как сказал Embattled Swag,

if (creditUnits < 12){
 System.out.print("Enter a number greater than 11: ");
 in.next();
}

in.next() отбрасывает то, что вы вводите. Тогда сканер блокируется, если вы вводите пробелы только до тех пор, пока он не получит здесь ******:

creditUnits = in.**********();

Если вы введете что-либо еще в дополнение к пробелу (я предполагаю, что вы просто нажали кнопку ввода), тогда он распечатает часть "Вы будете принимать...", если это действительный двойной. В противном случае он выдает исключение InputMismatchException.

Вам, вероятно, лучше получить вход и применить ваши проверки на достоверность вручную, в отличие от цикла **********

public static void main(String[] args) throws IOException {
 System.out.print("Enter the credits you will take each term: ");
 Scanner in = new Scanner(System.in);
 String input = in.next();
 ****** credits = 0.0;
 while (true) {
 try {
 credits = ******.parse******(input);
 if (credits < 12.0) {
 throw new IllegalArgumentException("Must take at least 12 credits.");
 } else {
 break;
 }
 } catch(IllegalArgumentException e) {
 System.out.print("Enter a number greater than 11: ");
 input = in.next();
 }
 }
 System.out.println("You will be taking " + credits + " credits per term.");
 in.close();
}

licensed under cc by-sa 3.0 with attribution.