next(), nextInt(), nextLine(), nextDouble()

168
27 декабря 2018, 03:10

Если у нас int x = scan.nextInt(), то при вводе строковых значений и double значений вылазит Exception.

Если у нас String x = scan.nextLine, то при вводе int значений и double значений, мы не получаем Exception (или можно сказать ошибку), как будто nextLine() не для String значений, а для всех. Почему, если мы чётко указали:

String x = scan.nextLine();

Если у нас double x = scan.nextDouble(), то при вводе String значений он выдаёт Exception и int (если пишем 123 - то выведет 123.0).

Почему всё отрабатывает как надо, а nextLine() принимает любые значения, если мы указали String, то есть "задали параметры строго".

Answer 1

Потому что введеные через nextLine() числа воспринимаются, как текст - символы цифр, а не числа, с которыми можно производить арифметические действия. Возможно это не очевидно, но цифры тоже могут быть текстом, а так же имеют свои коды в кодовой таблице символов.

Для того, чтобы с полученным таким образом числом можно было производить числовые операции, как сложение или вычитание, его предварительно нужно преобразовать из строки, собственно, в число, к примеру типа int. Без преобразования такое число можно только вывести на экран, но не сложить с другим (точнее, мы получим сложение строк, как "123" + "1" будет "1231", а не 124.

В случае nextInt() этого, очевидно, не требуется и мы сразу получаем числовой тип (int), для которого доступны любые математические действия. Естественно, этот тип не может принимать символы, кроме чисел и выдает эксепшен

PS: в чем отличие. Рассмотрим пример для таблицы кодов ASCII и числа типа byte, так как и тот и другой использует 1 байт для хранения единицы информации.

Символ "1" имеет код в таблице символов (для ASCII-кодировки это 0x31), но число 1 не имеет кода, оно хранится в виде, собственно, числа в памяти.
Так, к примеру, символы "123" будут хранится, как набор кодов: 0x31,0x32,0x33 и занимать 3 байта (по одному байту на каждый символ-код), в то время, как число 123 будет занимать один байт и храниться в этом байте, как значение - 123. Мы можем сложить его с другим таким же числом (например, 7) и новое число будет по прежнему занимать один байт (будет в этом байте хранится значение - 130). С набором символов-кодов мы этого делать не можем, так как они представлены совершенно другим образом.

READ ALSO
Как использовать Intbuffer с FileChanel с RandomAccessFile?

Как использовать Intbuffer с FileChanel с RandomAccessFile?

Нужно записать строку, для этого использую FileChanel and IntBuffer, чтобы скорость записи была высокой, но получаю ошибку Exception in thread "main" javanio

149
Как реализовать multi touch (appium)

Как реализовать multi touch (appium)

Хочу реализовать мультитач в моб тестированииС документации appium взял код, подключил библиотеки (указанные на сайте):

171
Передать реферер интентом

Передать реферер интентом

Открываю страничку таким кодом:

198
Изменение атрибутов в Active Directory

Изменение атрибутов в Active Directory

Есть АД с 1000 пользователей, атрибуты к примеру как: имя, организация, город уже заполнены, есть excel файл с еще одним атрибутомВопрос как внести...

159