2015-07-05 2 views
0

Я пытаюсь убедиться, что вход пользователя является целым числом, но когда я использую приведенный ниже код, я просто получаю бесконечный цикл инструкции print. Любые советы по улучшению?Ошибка при попытке с try-catch и while loop

boolean valid = false; 
System.out.println("What block are you gathering? (use minecraft block ids)"); 
while(valid == false){ 
    try{ 
     block = input.nextInt(); 
     valid = true; 
    } 
    catch(InputMismatchException exception){ 
     System.out.println("What block are you gathering? (use minecraft block ids)"); 
     valid = false; 
    } 
} 
+0

Какой тип 'block'? –

+0

@ УмаКант Здесь неважно :). – Tom

+0

Не могли бы вы подробнее рассказать? ив используется NumberFormatException, но получает эту ошибку вместо того, чтобы: исключения в потоке "главный" java.util.InputMismatchException \t в java.util.Scanner.throwFor (Unknown Source) \t в java.util.Scanner.next (Unknown Source) \t в java.util.Scanner.nextInt (Unknown Source) \t в java.util.Scanner.nextInt (Unknown Source) \t в firsttry.Main.main (Main.java:28) – deano3663

ответ

2

nextInt() не потребляет недопустимый ввод поэтому он будет пытаться прочитать ту же недопустимое значение снова и снова. Чтобы решить эту проблему, вы должны использовать ее явно, вызывая next() или nextLine(), которые принимают любое значение.

BTW, чтобы сделать ваш код более чистым и избежать дорогостоящих операций, таких как создание исключений, вы должны использовать методы, такие как hasNextInt().

Вот как вы можете организовать ваш код

System.out.println("What block are you gathering? (use minecraft block ids)"); 
while(!input.hasNextInt()){ 
    input.nextLine();// consume invalid values until end of line, 
        // use next() if you want to consume them one by one. 
    System.out.println("That is not integer. Please try again"); 
} 
//here we are sure that next element will be int, so lets read it 
block = input.nextInt();