Найти в Дзене
Alex Pevnenko

Особенности "сканирования" в Java

По долгу службы мне часто приходиться писать код на Java. Но вот пользоваться классом Scanner удается крайне редко. Недавно попалась банальная задача - вывод из потока ввода информацию в консоль (для просты рассмотрения будет выводить именно в консоль), и я ничего не предполагая пишу стандартный код: То при выводе в консоль нас будет ждать следующая картина: ===================================================== Enter number: 6
Enter string:
Integer = 6
String =
Process finished with exit code 0 ===================================================== Что собственно произошло ?! Мы ввели цифру 6, нажали Enter и ожидаем, что далее будем вводить строку ... Но увы , нет , программа завершается, а в переменной, куда мы хотели положить нашу строку лежит ничего ) ну, почти ничего - на самом деле там символ перевода каретки. Давайте разберемся почему так происходит и как бороться с данным явлением. Посмотрим на алгоритм наших действий: 1) Запустили код 2) Ввели с клавиатуры цифру 6 3) Наж

По долгу службы мне часто приходиться писать код на Java. Но вот пользоваться классом Scanner удается крайне редко.

Недавно попалась банальная задача - вывод из потока ввода информацию в консоль (для просты рассмотрения будет выводить именно в консоль), и я ничего не предполагая пишу стандартный код:

scannerTest1.java

То при выводе в консоль нас будет ждать следующая картина:

=====================================================

Enter number: 6
Enter string:
Integer = 6
String =

Process finished with exit code 0

=====================================================

Что собственно произошло ?! Мы ввели цифру 6, нажали Enter и ожидаем, что далее будем вводить строку ... Но увы , нет , программа завершается, а в переменной, куда мы хотели положить нашу строку лежит ничего ) ну, почти ничего - на самом деле там символ перевода каретки.

Давайте разберемся почему так происходит и как бороться с данным явлением.

Посмотрим на алгоритм наших действий:

1) Запустили код

2) Ввели с клавиатуры цифру 6

3) Нажали Enter

4) Ожидаем, что программа предложит ввод следующих данных, но наблюдаем только завершение программы

Пункт 3 наших действий как раз таки и есть разгадка - мы наживаем Enter, который в конец введенных нами данных добавляет "\n", а метод nextInt() у класса Scanner не считывает все , а берет только int значение =) Поэтому следующий метод nextLine() подхватcaывает символ перевода строки и выводит его, от сюда и не корректная работа программы (формально корректная, но с точки зрения потребителя - нет).

Решение данной проблемы банальное и простое - вызов метода nextLine() на объекте Scanner класса после каждого такого перехода с числового значения на строки:

scannerTest2.java

Тогда и получаем корректный вывод:

=====================================================

Enter number: 6
Enter string: Hello
Integer = 6
String = Hello

Process finished with exit code 0

=====================================================

Спасибо Тебе, что прочитал до конца, надеюсь было полезно!)