2016-02-26 4 views
0

Я натолкнулся на этот код, и я хочу подтвердить, что, вводя напрямую, не используя объект любого типа данных, все, что мы делаем, это делать ввод и отображать его, и мы ничего не храним в нем?Как вводилось только использование объекта класса Scanner?

а также как условие внутри цикла while истинно в первый раз? Поскольку мы еще не вводили никаких данных.

ответ

0

Уверенный, ваш код не хранит sc.nextLine(), поэтому это значение будет отброшено после инструкции System.out.println.

Также для hasNext():

Этот метод может блокировать во время ожидания ввода для сканирования.

поэтому условие будет выполняться после того, как поток начинает вносить свой вклад, и этот метод будет блокировать ждет, чтобы это произошло или Exception произойти (например: если сканер закрывается).

Пока ничего из этого не происходит, метод hasNext() не возвращается, поэтому условие в while по-прежнему не оценивается, поэтому цикл заблокирован.

+0

Не могли бы вы еще раз объяснить, как while() цикл работает в этом коде? Я имею в виду, что я не мог понять, как hasNext() заблокировал while() – shiwchiz

+0

Я обновил ответ, надеюсь, он объяснит лучше. – Berger

0

Пройдем код:

Scanner sc = new Scanner(System.in)

java.util.Scanner.Scanner(InputStream) конструктор вызывается, и у вас есть объект sc типа Scanner, который считывает из System.in.

int c = 0;

Теперь у вас есть примитивный c примитивного типа int.

while(sc.hasNext()) { ... }

Цикл while оценивает sc.hasNext(), который true. Согласно документации, sc.hasNext() возвращает true тогда и только тогда, когда на входе имеется еще один токен. В вашем случае это означает, что InputStream открыт.

{... System.out.println(++c + " " + sc.nextLine()); ...}

sc.nextLine() проблема. Предполагая, что вы не изменили System.in, консоль/терминал заблокирует цикл (т. Е. Удерживайте цикл приостановленным), пока вы не дадите ему вход (введите текст и нажмите [ENTER]).

Так, в целом:

Scanner::hasNext() возвращает истину, если и только если это возможно, чтобы получить больше вход (если вы используете System.in, это всегда будет правдой, пока вы не закроете сканер).
Если вы печатаете вход напрямую, вы не будете хранить никаких ссылок на него, и для него не будет выделено никакой памяти (если только Scanner.nextLine() не хранит его).

+0

Спасибо, но что вы подразумеваете под «тогда и только тогда, когда на входе есть еще один токен в нем»? – shiwchiz

+0

Итак, если ввод можно прочитать, он вернет 'true', но только если. Итак, если читать нечего, он вернет 'false'. – HyperNeutrino