2012-01-08 8 views
2

Я пишу программу из командной строки и хотел бы, чтобы пользователь ввел действительный возраст (целое число). С помощью класса Scanner, у меня есть что-то вроде этого:Проверка того, что пользователь ввел целое число

int getAge() { 
    Scanner = new Scanner(System.in); 
    int age; 
    boolean isValid = false; 

    while(!isValid) { 
     System.out.println("Please enter your age"); 
     if (myScanner.hasNext()) { 
     if (myScanner.hasNextInt()) { 
      age = myScanner.nextInt(); 
      isValid = true; 
     } else { 
      System.out.println("Please enter an integer"); 
     } 
     } 
    } 

    return age; 
} 

Проблема в том, что в то время как в цикле он продолжает чтение входных данных, не дожидаясь нового значения. Как я могу обойти это?

ответ

2

Вы не читаете токен в своем пути else, тем самым обрабатывая один и тот же ввод снова и снова. Просто добавьте следующую строку:

myScanner.next(); 

внутри else -block.

0

Вы также можете просто использовать что-то вроде этого. Чтобы прочитать всю строку с помощью BufferedReader, проанализируйте целое число из строки и поймайте любое исключение, которое может произойти.

InputStreamReader isr = new InputStreamReader(System.in); 
BufferedReader br = new BufferedReader(isr); 
String s = br.readLine(); 
int intVal; 
try { 
    intVal = Integer.parseInt(s); 
} 
catch(NumberFormatException nfe) { 
    //Do Something 
} 

Вы можете разместить это внутри своей петли. (Да, я понимаю, что он не использует Scanner ... просто хотел показать альтернативный подход.)

Смежные вопросы