Во-первых, вам не нужны 2 Scanner
объекта, потому что вы читаете из одного и того же места.
Помните - все, что вам нужно прочитать, достаточно одного Scanner
на файл!
Но настоящая проблема в том, что вы не очищаете недопустимый ввод пользователя. Метод hasNext
только проверяет, есть ли еще входные данные, готовые к обработке, но ничего не делает с ними.
Если вы обнаружите, что входные данные еще есть, но это не целое число (hasNext
возвращает true
но hasNextInt
возвращает false
), вы должны вызвать метод next
, чтобы получить оставшийся ввод независимо от типа (игнорируя возвращаемое значение).
Кроме того, поскольку вам нужно 3 идентичных цикла, лучше просто поместить один l oop в отдельный частный метод, который будет возвращать значение, а затем вызвать этот метод 3 раза.
privat int getNumberFromUser() {
do {
//your loop code here
} while (!valid);
return num;
}
//in main:
num1 = getNumberFromUser();
num2 = getNumberFromUser();
num3 = getNumberFromUser();