Почему Сканер пропускает nextLine () после использования других следующих функций?
Метод nextLine () класса java.util.Scanner продвигает этот сканер за пределы текущей строки и возвращает пропущенный ввод. Эта функция печатает остаток текущей строки, оставляя разделитель строк в конце. Следующий устанавливается после разделителя строк. Поскольку этот метод продолжает поиск по входным данным в поисках разделителя строк, он может выполнять поиск по всем входным данным в поисках пропускаемой строки, если разделители строк отсутствуют.
Синтаксис:
В чем проблема с методом nextLine ()?
Рассмотрим следующий пример кода:
// Java-программа, чтобы показать проблему с
// nextLine () метод класса сканера
public class ScannerDemo1 <
public static void main(String[] args)
// Объявляем объект и инициализируем
// предопределенный стандартный объект ввода
Scanner sc = new Scanner(System.in);
String name = sc.nextLine();
char gender = sc.next().charAt( 0 );
int age = sc.nextInt();
String fatherName = sc.nextLine();
String motherName = sc.nextLine();
// Распечатать значения для проверки
// если вход был получен правильно.
System.out.println( «Name: » + name);
System.out.println( «Gender: » + gender);
System.out.println( «Age: » + age);
System.out.println( «Father’s Name: «
System.out.println( «Mother’s Name: «
- Когда этот код запускается против ввода :
- Ожидаемый результат:
- Фактический результат:
Как вы можете видеть, метод nextLine () пропускает ввод для чтения и принимает имя Mother вместо отца. Следовательно, ожидаемый результат не совпадает с фактическим. Эта ошибка очень распространена и вызывает много проблем.
Почему возникает эта проблема?
Эта проблема возникает потому, что, когда метод nextInt () класса Scanner используется для чтения возраста человека, он возвращает значение 1 переменной возраста, как и ожидалось. Но курсор после чтения 1 остается сразу после него.
Поэтому, когда имя Отца читается с использованием метода nextLine () класса Scanner , этот метод начинает чтение с текущей позиции курсора. В этом случае он начнет читать сразу после 1. Таким образом, следующая строка после 1 — это просто новая строка, которая представлена символом ‘/ n’. Следовательно, имя Отца просто ‘/ n’.
Как решить эту проблему?
Эта проблема может быть решена одним из следующих двух способов:
- чтение целой строки для целого числа и преобразование его в целое число, или
потребляя оставшуюся новую строку, используя метод nextLine ().
В следующем примере показано, как решить эту проблему с помощью метода nextLine ():
// Java-программа для решения проблемы с
// nextLine () метод класса сканера
public static void main(String[] args)
// Объявляем объект и инициализируем
// предопределенный стандартный объект ввода
Scanner sc = new Scanner(System.in);
String name = sc.nextLine();
char gender = sc.next().charAt( 0 );
// Использование оставшейся новой строки
// используя метод nextLine ()
// читаем полную строку для целого числа
// и преобразовать его в целое число
int age = Integer.parseInt(sc.nextLine());
String fatherName = sc.nextLine();
String motherName = sc.nextLine();
// Распечатать значения для проверки
// если вход был получен правильно.
System.out.println( «Name: » + name);
System.out.println( «Gender: » + gender);
System.out.println( «Age: » + age);
System.out.println( «Father’s Name: «
System.out.println( «Mother’s Name: «
- Когда этот код запускается против ввода :
- Ожидаемый результат:
- Фактический результат:
Источник
Не запускается метод nextLine
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Не срабатывает метод nextLine();
Для практики решил написать программу приготовления чая. И всё бы хорошо но последний milk =.
Switch и .nextLine()
Доброго времени суток. Уже продолжительное время не могу решить следующую проблему: .
If и scan.nextline
Возможно глупый вопрос, но я только начал изучать JAVA. Ввожу в строке п но оператор if с условием.
Что-то странное с nextLine()
import java.util.Scanner; import java.lang.String; class Main < public static void main.
Добавь пустой sc.nextLine() после вызова sc.nextInt() для считывания символа ‘\n’ после числа и перевода курсора на следующую строку. Символ ‘\n’ возникает при нажатии клавиши Enter после ввода числа, он то и мешает дальнейшей работе
Как работает nextLine ?
Здравстуйте. Не могу понять, почему в address не записываются данные. В инете искал, понятного.
Капризный Scanner.nextLine()
Вот я уже запарился за время знакомства с java с тем что Scanner постоянно работает как-то по.
Неправильно работает ввод с консоли через NextLine()
Только начал изучать java, появилась проблема с вводом данных из консоли. По алгоритму программа.
Не запускается метод paint
Не могу запустить вот этот код. Вылазит вот такая вот ошибка (Error: Main method not found in class.
Не запускается метод на ветвлении else if
private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) < .
Источник
Как работает метод nextLine() в классе Scanner?
Написал малюсенькую программку:
Скомпилировал. Стартовал.
Программа попросила ввести ширину.
Ввел ширину.
Программа попросила ввести длину.
Ввел длину.
А вот дальше программа должна была попросить ввести фамилию, но она не остановилась. А сразу вывела сообщение о размерах листа и об инженере, но без фамилии, так как шанс ввести ее программа не предоставила.
Уже второй день читаю описание метода nextLine() на английском языке. Но никак не могу понять, почему после использования nextDouble() не работает nextLine(). Точнее, он работает, но таким образом, что я не понимаю.
Потому что, если поставить строки с
перед строками с nextDouble(), то программа будет останавливаться три раза, как и задумывалось.
Если есть у кого-то из зубров время и желание рассказать новичку «на спичках» почему так происходит, буду очень признателен. Или поделитесь, пожалуйста, ссылкой на русский перевод описания метода nextLine().
- Вопрос задан более трёх лет назад
- 20937 просмотров
nextLine() читает до конца текущей строки (символа перевода строки или конца потока) и возвращает всё, что было в этой строке.
nextDouble() читает double. Оно не читает и не пропускает ничего ПОСЛЕ double.
Итак вы вводите что-то вроде «3.15\n», где \n — символ перевода строки.
nextDouble() извлекает 3.14 и оставляет «\n» в буфере.
nextLine() натыкается на \n и прекращает работу, прочитав 0 символов — пустую строку.
Проверьте: введите в одной строке «1 2 Иванов», и оно заработает (Правда пробел перед Иванов прочтётся как часть фамилии)
Модно вызвать nextLine(), чтобы поглотить этот перенос строки и ожидать новой строки.
Sirikid: Я правильно Вас понял? Код может выглядеть вот так?
Скомпилировал, стартовал. Теперь все работает, как планировалось. Т.е. в первый вызов этот метод хватает пустую строку и проскальзывает, а во втором вызове уже можно набирать строку.
Источник
Капризный Scanner.nextLine()
Вот я уже запарился за время знакомства с java с тем что Scanner постоянно работает как-то по своему и не так как я того ожидаю. Кто-то может в конце-концов объяснить мне как работает Scanner.next и Scanner.nextLine так чтобы я потом не натыкался на чудеса.
(То что я ввожу буду писать начиная с > , перевод строки (энтер) изображаю как \n. О том что выполнение завершено пишу в «»)
Пример: я хочу считать как одну строку фио, те будет три слова с пробелами, явно надо nextLine.
Выполняю:
Введите ФИО: >Василий Иванович Пупкин \n
«Выполнение завершено».
Вроде всё хороше же, окей, теперь мне надо только имя и отчество:
[/JAVA]
Выполняю:
Введите Имя и Отчество: >Василий Иванович\n
>\n
«Выполнение завершено»
Вот какого хрена мне пришлось ещё раз энтер нажать (добавить перевод строки) когда и так было два слова и перевод строки? Ему одного \n мало оказалось?
Ок, идём дальше, усложним задачу (хотя чтение двух строк и слово усложним плохо сочетаются) —
считаем с консоли имя и отчество, а потом ещё и возраст:
Выполняем:
Введите Имя и Отчество > Василий Иванович\n
>\n
>\n
Введите возраст: >20\n
«Выполнение завершено»
Java машина у меня последняя с сайта sun, ос x64, среда нетбинс. Но не думаю что это оно только у меня так, в чём секрет? Как читать значения из консоли так чтобы оно работало как-то более логично, ато понаписывали своих высокоинтеллектуальных функций которые ещё за меня решают столько они там строк читать будут, а мне воюй с ними . Тему того что с консоли мол и так читать в настоящем приложении не приходиться давайте опустим, тут важен сам факт того как читать по нормальному, а не то часто ли это используется в реальном приложении.
Источник
Странная работа scanner.nextInt()
Всем привет. Я совсем новичок и все утро ломаю голову над таким вопросом. К примру, простая программа, которая записывает вопросы и ответы в массив:
Если переменную int skolko записывать в программу ( int skolko = 3; ) то программа работает адекватно и запрашивает по очереди вопрос / ответ ровно 3 раза.
Если переменную skolko вводить через int skolko = scan.nextInt(); , то программа сперва просит ввести цифру, а потом сразу выводит
то есть ввода значения, после The card #1: не происходит и для card #1 присваивается пустое значение ( «» ).
1 ответ 1
Причина проблемы:
Сначала нужно понять как работает scanner.nextLine() . Он дочитывает строку (по факту, он движется по массиву байт из InputStream консоли, т.е. из System.in ) до её конца (до \n , либо \r\n , в зависимости от среды), после чего останавливается на первом же символе после символа(ов) конца строки, а все что он прочитал (за исключением символа(ов) конца строки он возвращает в качестве результата вызова).
Перед for вы вызываете scanner.nextInt() , который считывает число из InputStream консоли и останавливает свой указатель на первым же символе после окончания числа, в вашем случае, т.к. после ввода числа вы нажали enter у вас там находится символ(ы) перевода строки.
На первой итерации for у вас вызывается scanner.nextLine() , который согласно вышеописанному механизму читает все символы до конца строки и останавливается, но в вашем случае он уже стоял на символе конца строки, поэтому он просто сдвинул свой указатель на первый же символ после символа(ов) конца строки и остановился, а в результате своего вызова вернул пустую строку ( «» ).
Решение проблемы:
Самый простой для вас способ: написать scanner.nextLine(); сразу же после вызова scanner.nextInt(); для перевода scanner на следующую строку (указатель в считываемом InputStream смещается на первый символ после символа(ов) конца текущей строки), где ввод символа контра строки еще не был осуществлен (т.к. её ввод, вообще, еще не был осуществлен).
Пример альтернативного варианта использования nextInt:
На основании вопросов из комментариев приведу пример, поясняющий как еще можно работать с методом nextInt :
Как видите, не обязательно выполнять nextLine после каждого nextInt , вы можете за раз из одной строки прочитать несколько чисел, разделенных пробельными символами.
Рекомендации:
В рамках Java для наименования классов согласно naming conventions принято использовать стиль UpperCamelCase (например, Proba ), а не lowerCamelCase, как у вас ( proba ).
Источник