Использование scanner.next () вне цикла дает странные результаты - PullRequest
0 голосов
/ 20 ноября 2018

Недавно моя подруга показала мне свой код в поисках моего совета о том, почему это не сработает.Ее оригинальный код был таким:

public static void printStem(String word) ...

public static void main(String[] args)
{

  Scanner keyboard = new Scanner(System.in);
  System.out.println("Please enter the words: "); 
  String word = keyboard.next(); 
  printStem(word);

  while (keyboard.hasNext())
  {
    printStem(word);
    word = keybord.next();
  }
}

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

В конце концовЯ понял, что это будет работать, как и ожидалось, при удалении keyboard.next() из-за пределов цикла, например:

public static void printStem(String word) ...

public static void main(String[] args)
{
  Scanner keyboard = new Scanner(System.in);
  System.out.println("Please enter the words: "); 

  while (keyboard.hasNext())
  {
    String word = keybord.next();
    printStem(word);
  }
}

Когда меня спросили, почему это так, у меня не было никакого правдоподобного объяснения, поскольку это должно вести себя идентично.Мое лучшее предположение - что-то должно быть вонючим с hasNext(), но я не мог понять, почему именно.Так.Что здесь происходит?Любое объяснение приветствуется:)

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Некоторые пояснения по поводу hasNext ():

Returns true if this scanner has another token in its input. 
This method may block while waiting for input to scan. 
The scanner does not advance past any input.

В вашем первом фрагменте кода

  1. вы сканируете слово: String word = keyboard.next();

  2. Вы печатаете это: printStem(word);

  3. Вы входите в цикл while, который ждет, пока вы не введете какой-либо ввод: keyboard.hasNext()

  4. На шаге 3 вы берете ввод, но никогда не сохраняете его в строковом слове и печатаете его.Естественно, будет напечатано предыдущее значение слова.

  5. Затем вы выполните следующее чтение с помощью next ().

Объяснение для следующего():

Finds and returns the next complete token from this scanner. A complete token is preceded and followed by input that matches the delimiter pattern. This method may block while waiting for input to scan, even if a previous invocation of hasNext() returned true.

Следовательно, вы получаете странное поведение.

0 голосов
/ 20 ноября 2018

Это приведет к действительно странным результатам

Да, потому что логика неверна.

Вы получите ввод

String word = keyboard.next(); 

распечатать его

printStem(word);

, затем напечатайте его снова и попросите другое слово:

while (keyboard.hasNext())
{
    printStem(word);
    word = keybord.next();
}

Так что каждый раз, когда вы зацикливаетесь, вы печатаете введенное слово в последний раз, ачем слово, которое они ввели это время.Вам просто нужно поменять две строки в цикле while, что делает избыточными keyboard.next() и printStem(word) вне тела цикла.

, поскольку это должно вести себя идентично

Нет, не должно.Вы изменили порядок операций в теле цикла while.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...