Задать вопрос
@dvlprjv15
Люблю программирование. Сейчас изучаю Python.

Как работает метод nextLine() в классе Scanner?

Написал малюсенькую программку:
import java.util.*;

public class inputtest1
{
  public static void main(String[] args)
  {
    Scanner ott = new Scanner(System.in);

// объявлена константа сколько сантиметров в дюйме
    final double CM_PER_INCH = 2.54;
// объявлены переменные: ширина листа, высота листа, исполнитель
    double paperWidth;
    double paperHeigth;
    String name;
// получить от пользователя значения ширины и высоты листа в дюймах
    System.out.print("Введите ширину листа в дюймах: ");
    paperWidth = ott.nextDouble();
    System.out.print("Введите высоту листа в дюймах: ");
    paperHeigth = ott.nextDouble();
// получить от пользователя его фамилию
    System.out.print("Введите свою фамилию: ");
    name = ott.nextLine();

// программа выводит сообщение о размерах листа и фамилию исполнителя
    System.out.println("Размеры листа в сантиметрах: " 
+ paperWidth * CM_PER_INCH + " на " + paperHeigth * CM_PER_INCH
+ " сантиметров");
    System.out.println("Данные вводил инженер: " + name);
  }
}

Скомпилировал. Стартовал.
Программа попросила ввести ширину.
Ввел ширину.
Программа попросила ввести длину.
Ввел длину.
А вот дальше программа должна была попросить ввести фамилию, но она не остановилась. А сразу вывела сообщение о размерах листа и об инженере, но без фамилии, так как шанс ввести ее программа не предоставила.

Уже второй день читаю описание метода nextLine() на английском языке. Но никак не могу понять, почему после использования nextDouble() не работает nextLine(). Точнее, он работает, но таким образом, что я не понимаю.
Потому что, если поставить строки с
System.out.print("Введите свою фамилию: ");
    name = ott.nextLine();

перед строками с nextDouble(), то программа будет останавливаться три раза, как и задумывалось.

Если есть у кого-то из зубров время и желание рассказать новичку "на спичках" почему так происходит, буду очень признателен. Или поделитесь, пожалуйста, ссылкой на русский перевод описания метода nextLine().
  • Вопрос задан
  • 35239 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
@MiiNiPaa
nextLine() читает до конца текущей строки (символа перевода строки или конца потока) и возвращает всё, что было в этой строке.

nextDouble() читает double. Оно не читает и не пропускает ничего ПОСЛЕ double.

Итак вы вводите что-то вроде "3.15\n", где \n — символ перевода строки.
nextDouble() извлекает 3.14 и оставляет "\n" в буфере.
nextLine() натыкается на \n и прекращает работу, прочитав 0 символов — пустую строку.

Проверьте: введите в одной строке "1 2 Иванов", и оно заработает (Правда пробел перед Иванов прочтётся как часть фамилии)

Модно вызвать nextLine(), чтобы поглотить этот перенос строки и ожидать новой строки.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@DiMelnitsa
Столкнулся с подобной бедой.
Вместо nextLine() использовал next().
Заработало нормально.
Ответ написан
@tatirybina
хорошо описаны методы сканера вот в этой статье https://vertex-academy.com/tutorials/ru/rabota-so-...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы