2012-02-18 1 views
0

Я пытаюсь взять строку ввода с помощью сканера. Но он спрашивает меня больше строк, которые ожидали: не следует с этим кодом просить 5 строк?Сканер спрашивает больше строк, которые ожидали

public void go() 
{ 
    Scanner sc=new Scanner(System.in); 
    ArrayList<String> list=new ArrayList<String>(); 
    String temp=new String(); 
    Integer i=new Integer(0); 
    while(sc.hasNextLine() && i<5) 
    { 
     temp=sc.nextLine(); 
     list.add(list.size(),temp); 
     i++; 
    } 
} 

Если я пытаюсь запустить его, он запрашивает у меня 6 строк, прежде чем консоль перестанет принимать входные данные. Но я в начале равен нулю, он увеличивается 5 раз, а затем становится 5. Так почему же он также остается в то время, когда я 5?

Решение: Оба метода решили проблему.

ответ

1

Если i == 5 еще sc.HasNextLine() называется. Ремонт:

while (i < 5 && sc.hasNextLine()) 

P.S. do int i = 0;

+0

Как это исправить? –

+0

@HovercraftFullOfEels Если i достигает 5, i <5 будет ложным и конец цикла while до вызова sc.hasNextLine(). Уже sc.hasNextLine делает чтение, если вызвано. –

+0

Это решило проблему. –

4

У вас возникло недоразумение в отношении исполнения кода. Он запрашивает у вас 6 строк, но добавляет 5 из них в список. Причина, по которой вы запрашиваете еще одну строку, заключается в том, что выполняется sc.hasNextLine(), ее оценивают до true, поэтому вы видите, что консоль ожидает, что вы что-то введете, но затем приходит вторая часть условия цикла: i<5, это оценивается как false поэтому тело цикла пропущено, и у вас есть 5 строк в вашем списке. Вы можете увидеть их в действии, отлаживая ваш код в Eclipse или Netbeans или другой Java IDE.

Просто для удобства упростите свою петлю. Удалите sc.hasNextLine() из условия цикла.

+0

Есть решение, 1+. Еще лучше: используйте цикл for. Для этого они нужны. –