Страницы

Поиск по вопросам

пятница, 15 февраля 2019 г.

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

Если у нас 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, то есть "задали параметры строго".


Ответ

Потому что введеные через 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). С набором символов-кодов мы этого делать не можем, так как они представлены совершенно другим образом.

Комментариев нет:

Отправить комментарий