2013-05-27 3 views
6

Вот мой код. Цель состоит в том, чтобы ввести некоторую базовую информацию (возраст, имя, пол) для x числа пациентов.Java - Пропуск строки при чтении пользовательского ввода в массив (для цикла)

public static void main(String[] args) { 

    int numPatients = 2; 

    int[] age = new int[numPatients]; 
    String[] gender = new String[numPatients]; 
    String[] name = new String[numPatients]; 
    Scanner in = new Scanner(System.in); 

    /* 
    * Obtaining patients details: name, gender, age 
    * First create a Scanner input variable to read the data 
    */ 
    for (int i = 0; i < numPatients; i++) 
    { 
    System.out.println("Enter name of patient " + (i+1)); 
    name[i] = in.nextLine(); 

    System.out.println("Enter gender (male/female) of patient " + (i+1)); 
    gender[i] = in.nextLine(); 

    System.out.println("Enter age of patient " + (i+1)); 
    age[i] = in.nextInt(); 
    } 

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

Enter name of patient 1 
Mark 
Enter gender (male/female) of patient 1 
Male 
Enter age of patient 1 
34 
Enter name of patient 2 //Skipped. Could not enter input here 
Enter gender (male/female) of patient 2 
Jenna 

Любая идея, почему это происходит? Лучше ли использовать BufferedReader?

ответ

7

Если вы должны использовать Scanner, то всегда использовать nextLine(). Проблема заключается в том, что nextInt() считывает только только целую часть ввода и останавливается перед тем, как она считывает нажатие клавиши Enter. Затем следующий вызов nextLine() видит нажатие клавиши Enter в буфере и все введенные вами пустые имена.

Таким образом, вы можете сделать что-то вроде:

age[i] = Integer.parseInt(in.nextLine()); 

и быть готовым для обработки исключения, что произойдет, если пользователь вводит что-то другое, чем число.

+0

Действительно интересно, и я бы не поймал этого. Спасибо за помощь, Грег. Он работает сейчас! – JPwire

0

Если вы уверены, что имя будет одним словом (не проблема для мужчины или женщины), вы можете изменить вход сканера, чтобы просто получить строку;

in.next(); 

это работает нормально (только если имя - одно слово).

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