Почему я не могу вызвать метод nextLine () дважды в Java? - PullRequest
0 голосов
/ 10 сентября 2018

При использовании метода Java nextInt () я наткнулся на этот код:

Scanner scan = new Scanner(System.in);
int count = scan.nextInt();
String string1 = scan.nextLine();

Я знаю, что строка1 будет содержать пустую строку. Мой вопрос заключается в том, почему двойной вызов метода nextLine, как показано ниже, приводит к ошибке:

String string1 = scan.nextLine().nextLine();

Ответы [ 4 ]

0 голосов
/ 10 сентября 2018

Ссылка: Почему nextLine () возвращает пустую строку?

scannerObj.nextInt() не читает следующий символ новой строки, поэтому первая nextLine (которая возвращает остаток текущей строки) will always return an empty string.

Это должно работать:

int count = readInput.nextInt();
readInput.nextLine();

String input=readInput.nextLine();
0 голосов
/ 10 сентября 2018

Как это отладить?

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

Предполагая, что вы находитесь в среде IDE, такой как IntelliJ или Eclipse, у них есть для этого богатые функции (их легко гуглить).

Для IntelliJ, например:

  • ctrl + q в имени метода покажет вам тип возвращаемого значения и информацию о нем.
  • Если вы просто напишите первый вызов метода в строке, вы можете сделать alt + enter и сказать ему создать локальную переменную. Это будет сделано для правильного типа (который был бы String, делая это очевидным.
  • Вы также можете сделать ctrl + b, чтобы перейти к вызову функции и увидеть, что он ясно возвращает String.
  • Кроме того, отладчик сделал бы это довольно очевидным.

Java Doc

Кроме того, вы всегда можете довольно легко перейти к документу Java для сканера в Google.

https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#hasNextLine()

На самом деле, документы Java часто доступны или загружаются в вашей IDE, когда вы переходите к функциям с помощью ctrl + b, что спасает вас даже при использовании браузера:).

Базовый ответ

Но в любом случае ваша проблема заключается в том, что первый вызов функции возвращает строку, которая не является сканером, поэтому вы не можете использовать функцию сканера на ней:).

0 голосов
/ 10 сентября 2018

Посмотрите на тип возврата Scanner#nextLine(). Возвращает String, а не Scanner.

То, что вы написали, эквивалентно:

String string1 = scan.nextLine();
String string2 = string1.nextLine();

Цепочки методов предназначены для перехода от одного объекта к другому в соответствии с типом возвращаемого значения каждого метода, что делает ваш код более компактным и уменьшает количество объявлений, которые вы делаете.

0 голосов
/ 10 сентября 2018

Здесь:

String string1 = scan.nextLine().nextLine();

Давайте разберемся:

String string1 = scan.nextLine()

вызывает nextLine() на сканере. Возвращает String .

Таким образом, ваш код сводится к

String string1 = someOtherString.nextLine(); 

что, конечно, не может работать. Потому что класс String не имеет представления о следующей строке, и поэтому такого метода нет!

Помните: сканер возвращает строку, и это два совершенно разных объекта.

Если вы берете яйцо из коробки, с какой стати вы ожидаете, что вы можете взять другое яйцо из того яйца, которое у вас есть ?! Вы можете взять два яйца из одной коробки, но не яйцо из яйца.

Наконец: да, есть идея «плавных» API, которые позволяют связывать вызовы методов «такими» способами. Но это может работать только для сценариев, которые специально предназначены именно для этого.

...