По сути, происходит то, что сканер сталкивается с ошибкой, когда данный токен недействителен, поэтому он не может пройти дальше этого значения. Когда следующая итерация запускается снова, scanner.nextInt () снова пытается просканировать следующее входное значение, которое все еще является недопустимым, поскольку оно там никогда не проходило.
Что вы хотите сделать, это добавить строку
scanner.next();
в вашем предложении catch, по сути, пропустить этот токен.
Примечание: Ваш метод в общем неоправдан. Вы можете сократить это в этом.
private static int nonNegativeInt() {
int value = 0;
while (true) {
try {
if ((value = scanner.nextInt()) >= 0)
return value;
System.out.println("Please enter a positive number");
} catch (InputMismatchException e) {
System.out.println("That is not a valid value");
scanner.next();
}
}
}