Проблема заключалась в том, что вы не продвинули Scanner
мимо проблематичного ввода. Из документа hasNextInt()
:
Возвращает
true
, если следующий токен в этом входе сканера может быть интерпретирован как значениеint
в базовом значении по умолчанию, используяnextInt()
.Это относится ко всем методам
hasNextXXX()
: они возвращаютtrue
илиfalse
, не продвигаяScanner
.Вот фрагмент, иллюстрирующий проблему:
String input = "1 2 3 oops 4 5 6"; Scanner sc = new Scanner(input); while (sc.hasNext()) { if (sc.hasNextInt()) { int num = sc.nextInt(); System.out.println("Got " + num); } else { System.out.println("int, please!"); //sc.next(); // uncomment to fix! } }
Вы обнаружите, что эта программа перейдет в бесконечный цикл, повторно задав
int, please!
.Если вы раскомментируйте оператор
sc.next()
, затем онScanner
пройдет мимо маркера, который не работаетhasNextInt()
. Затем программа будет печатать:Got 1 Got 2 Got 3 int, please! Got 4 Got 5 Got 6
Тот факт, что сбой
hasNextXXX()
не пропускает вход, преднамерен: он позволяет выполнять дополнительные проверки этого токена, если это необходимо. Вот пример, иллюстрирующий:String input = " 1 true foo 2 false bar 3 "; Scanner sc = new Scanner(input); while (sc.hasNext()) { if (sc.hasNextInt()) { System.out.println("(int) " + sc.nextInt()); } else if (sc.hasNextBoolean()) { System.out.println("(boolean) " + sc.nextBoolean()); } else { System.out.println(sc.next()); } }
Если вы запустите эту программу, вы получите следующее:
(int) 1 (boolean) true foo (int) 2 (boolean) false bar (int) 3