2014-12-21 2 views
2

Я хочу прочитать ввод данных пользователем, как: 11 12 13 14 15 16Java сканер - не может читать ввод данных пользователем

Scanner sc = new Scanner(System.in); 
    while(sc.hasNext()){ 
     System.out.println(sc.next()); 

    } 
    System.out.println("Test"); 

но новее выходит из цикла While и печатает «Test». Как я мог прочитать этот ввод?

+0

Вы нажимая клавишу ВВОД после ввода этого? – FlyingPiMonster

+0

да я .. это распечатать sc.next(), но затем просто останавливается и не выходит из цикла while для печати. ​​Тест –

+2

Вы не выйдете из этого цикла, не используя определенное слово «завершения». 'System.in' всегда запрашивает больше ввода, поэтому' sc.hasNext() 'всегда истинно. – Tom

ответ

1

Вы можете разбить цикл в зависимости от того, хотите ли вы выйти или нет.

public static void main(String[] args) { 
     Scanner sc = new Scanner(System.in); 
     while(sc.hasNext()){ 
      String next = sc.next(); 

      if (next.equals("q")) { //if user press q then break the loop 
       break; 
      } 
      System.out.println(next); 

     } 
     System.out.println("Test"); 
    } 
1

Использование апите как:

while(sc.hasNextInt()){ 
    int aba= sc.nextInt(); 
    if (aba == 0) {//or even non numeric value here would let this loop exit 
     break; 
    } 
} 

Так что вам нужно ввести 0 или даже в другом способе ввода не числовое значение Симметричное, чтобы выйти из цикла. Метод nextLine будет читать целую строку только один раз, а затем вам нужно будет проанализировать ее, а затем преобразовать в целое число, поэтому полезно использовать sc.nextInt, который будет работать для вас.

+0

Две вещи: ваша переменная называется 'aba', а не' abc': P. И вы можете добавить информацию, что любой нечисловый ввод также завершает цикл. Поэтому проверка на '0' может не потребоваться в качестве условия завершения. – Tom

+0

@Tom Спасибо, я его модифицировал. Я соглашаюсь на ввод другого нецифрового значения, но я подумал, что не стоит путать новичков с ненужными объяснениями. – SMA

2

Метод hasNext() работает следующим образом:

  • Если он видит конец файла, он возвращает ложь;
  • Если он видит другой действительный вход без пробелов, он возвращает true;
  • Если ни одно из указанных выше не верно, оно ожидает следующего ввода, который пользователь будет вводить, и не возвращается до тех пор, пока он не сделает.

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

Но когда вы работаете с консольным вводом (, не перенаправляется), тогда обычно пользователь не отправляет сигнал конца файла. Он просто нажимает Возвращает, и так, hasNext() сидит и ждет, будет ли пользователь вводить больше ввода на следующей строке и так далее.

Есть два основных способа решения этой:

  • Пользователь должен фактически прекратить ввод. После завершения ввода всех цифр и нажмите Return, также необходимо отправить символ конца файла последовательности, которая обычно CtrlD или CtrlZ.

    Если вы сделаете это, вы не сможете вводить никаких дополнительных данных для этой программы.

  • Программа сообщает пользователю ввести определенное значение, которое сообщит, что входной сигнал завершен. Например, строка «DONE». Когда вы сделаете это, вы должны изменить цикл, чтобы что-то вроде:

    String nextInput; 
    while(sc.hasNext() && ! (nextInput = sc.next()).equals("DONE")){ 
        System.out.println(nextInput); 
    } 
    
Смежные вопросы