JavaRush /Курсы /Java Syntax Pro /Ввод с клавиатуры

Ввод с клавиатуры

Java Syntax Pro
2 уровень , 5 лекция
Открыта

1. Чтение с консоли, System.in

В предыдущих лекциях мы познакомились с командами вывода на экран. Для этого мы использовали объект System.out, и его методы print() и println(). Просто и удобно.

Но, как вы уже наверное догадываетесь, одного вывода на экран недостаточно. Цель большинства программ — сделать что-то полезное для пользователя. Поэтому очень часто нужно, чтобы пользователь мог вводить данные с клавиатуры.

Как и для вывода, для ввода данных тоже есть специальный объект — System.in. Но, к сожалению для нас, он не настолько удобен, как нам бы хотелось. Этот объект позволяет считывать данные с клавиатуры по одному символу за раз.

Поэтому мы воспользуемся еще одним классом, который в паре с объектом System.in даст нам все, что нужно. В Java уже давно есть классы на все случаи жизни. С одним из них мы сейчас и познакомимся.


2. Класс Scanner

Класс Scanner (полное имя java.util.Scanner) умеет считывать данные из разных источников: консоль, файлы, интернет. Если мы хотим, чтобы он считывал данные с клавиатуры, мы должны передать ему объект System.in в качестве параметра – источника данных. А уж объект типа Scanner сам разберется, что с ним делать.

Считывание с клавиатуры с помощью объекта типа Scanner будет выглядеть примерно так:

Код Пояснение
Scanner console = new Scanner(System.in);
String name = console.nextLine();
int age = console.nextInt();
Создаем объект класса Scanner.
Читаем с клавиатуры строку текста.
Читаем с клавиатуры число.

Выглядит вроде несложно, но так ли все просто на самом деле?

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

Но для начала продемонстрируем пример полной программы, где используется класс Scanner:

import java.util.Scanner;
public class Solution {
   public static void main(String[] args)
   {
      Scanner console = new Scanner(System.in);
      String name = console.nextLine();
      int age = console.nextInt();

      System.out.println("Name: " + name);
      System.out.println("Age: " + age);
   }
}

3. Создание объекта Scanner

Первый вопрос – что это за строка Scanner console = new Scanner(System.in);?

Такая строка может сбивать с толку, однако вы будете постоянно встречать похожие вещи. Так что, думаем, настало время объяснить, что тут написано.

Вспомним, как мы обычно создаем переменную с текстом:

String str = "текст";
Объявление и инициализация строковой переменной

Сначала мы пишем тип переменной (String), затем ее имя (str) и, наконец, после знака равно пишем значение.

В нашей странной строке на самом деле все то же самое:

Scanner console = new Scanner(System.in);
Объявление и инициализация переменной типа Scanner

Все, что находится слева от знака равно — это объявление переменной типа Scanner по имени console. Можно было назвать ее, например, s или scanner, или даже keyboard. Тогда код выглядел бы так:

Scanner s = new Scanner(System.in);
String name = s.nextLine();
int age = s.nextInt();
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int age = scanner.nextInt();
Scanner keyboard = new Scanner(System.in);
String name = keyboard.nextLine();
int age = keyboard.nextInt();

Думаю, теперь все стало гораздо понятнее.

А код, что находится справа от знака равно, немного сложнее. Имеется в виду new Scanner(System.in); Но тут тоже ничего космического.

В этом коде мы говорим Java-машине: создай новый объект (слово new) типа Scanner и передай в него в качестве параметра то, из чего новосозданный объект Scanner будет брать данные — объект System.in.

После выполнения всей этой строки у нас появится переменная по имени console типа Scanner, с помощью которой наша программа сможет считывать данные с клавиатуры.


4. Вызов методов

В приведенном выше примере наша переменная console типа Scanner хранила у себя внутри ссылку на объект типа Scanner.

Чтобы вызвать методы объекта, на который ссылается переменная, нужно после имени переменной написать точку, а затем имя метода и параметры. Общий вид этой команды такой:

переменная.метод(параметры);
Вызов метода объекта, на который ссылается переменная

Примеры:

System.out.println("Привет");
System.out.println(1);

Если вы не планируете передавать в функцию параметры, нужно писать просто пустые скобки:

переменная.метод();
Вызов метода без передачи параметров

Пример:

System.out.println();

5. Ввод данных с консоли

Вводить данные с клавиатуры, когда у нас есть объект типа Scanner, очень легко.

Чтобы считать с клавиатуры строку, нужна команда:

String str = console.nextLine();

Когда программа дойдет до выполнения этой строки, она приостановится и будет ждать, пока пользователь введет данные и нажмет клавишу enter. После этого все, что ввел пользователь, будет сохранено в переменную str.

Чтобы считать с клавиатуры число, нужна команда:

int number = console.nextInt();

Тут все аналогично предыдущей команде. Когда программа дойдет до выполнения этой строки, она приостановится и будет ждать, пока пользователь введет данные и нажмет клавишу enter. После этого все, что ввел пользователь, будет преобразовано в число и сохранено в переменную number.

Если пользователь ввел данные, которые невозможно преобразовать в целое число, в программе возникнет ошибка, и она завершится.

Чтобы считать с клавиатуры дробное число, нужна команда:

double number = console.nextDouble();

Эта команда полностью аналогична команде nextInt(), только она проверяет, что введенные данные можно преобразовать в число double.

Пример программы, которая считывает с клавиатуры два числа и выводит их сумму:

import java.util.Scanner;
public class Solution {
   public static void main(String[] args)
   {
      Scanner console = new Scanner(System.in);
      int a = console.nextInt();
      int b = console.nextInt();

      System.out.println(a + b);
   }
}
Примечание

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



6. Другие методы класса Scanner

Это, кстати, были не все методы класса Scanner. Полный список будет выглядеть примерно так:

Метод Описание
nextByte()
Считывает данные и преобразует их в тип byte
nextShort()
Считывает данные и преобразует их в тип short
nextInt()
Считывает данные и преобразует их в тип int
nextLong()
Считывает данные и преобразует их в тип long
nextFloat()
Считывает данные и преобразует их в тип float
nextDouble()
Считывает данные и преобразует их в тип double
nextBoolean()
Считывает данные и преобразует их в тип boolean
next()
Считывает одно «слово». Слова разделяются пробелами или enter
nextLine()
Считывает целую строку

Есть еще методы, которые позволяют проверить тип еще не считанных данных (чтобы знать, каким методом их считывать).

Метод Описание
hasNextByte()
Там тип byte? Его можно будет преобразовать к byte?
hasNextShort()
Там тип short? Его можно будет преобразовать к short?
hasNextInt()
Там тип int? Его можно будет преобразовать к int?
hasNextLong()
Там тип long? Его можно будет преобразовать к long?
hasNextFloat()
Там тип float? Его можно будет преобразовать к float?
hasNextDouble()
Там тип double? Его можно будет преобразовать к double?
hasNextBoolean()
Там тип boolean? Его можно будет преобразовать к boolean?
hasNext()
Там есть еще одно слово?
hasNextLine()
Там есть еще одна строка?

7. Ввод данных из строки

Мы уже говорили выше, что класс Scanner умеет считывать данные из разных источников. И один из этих источников — строка текста.

Выглядеть это будет примерно так

String str = "текст";
Scanner scanner = new Scanner(str);

Вместо объекта System.in мы при создании объекта типа Scanner передаем в него строку – str. И теперь объект scanner будет считывать данные из строки. Пример:

Код программы: Пояснение:
import java.util.Scanner;
public class Solution {
   public static void main(String[] args)
   {
      String str = "10 20 40 60";
      Scanner scanner = new Scanner(str);
      int a = scanner.nextInt();
      int b = scanner.nextInt();

      System.out.println(a + b);
   }
}






// a == 10;
// b == 20;
На экран будет выведено: 30


Комментарии (745)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Long Long Уровень 3
21 сентября 2025
Что делать если задание стали премиум а нужно пройти
Iceberg Уровень 6
27 сентября 2025
Покупай подписку - не пожалеешь.
Dmitriy Pervyh Уровень 3
17 сентября 2025
Scanner использует пробелы как разделители по умолчанию, и умеет автоматически преобразовывать строки в числа, когда это можно сделать
Anonymous #3397071 Уровень 4
3 сентября 2025
я как активный пользователь чатагпт или алисыгпт вам заявляю, если что-то непонятно, напишите им объяснить яснее для нуба как и что, говорю вам интерес учиться у вас не пропадет так как будете понимать что делаете, ибо без них я реально могу не понять что там объясняется потому что терминология не для чайников а для около опытных юзеров.
Сергей Уровень 8
22 августа 2025
Перечитывал два-три раза лекцию, сперва поверхностно, потом более осознанно, а третий раз не выдержал и включил таймер pomodoro на часах, выключил телефон, напряг свои мозги, вчитывался в каждое слово лекции, в конце концов произошла ЭВРИКА!
Isa Уровень 1
11 августа 2025
Всем привет! Приглашаю вас на свой канал, где вы найдете: 📌 Ресурсы по Java Core, Git, SQL, Apache Maven, HTTP.Servlets и JUnit / Mockito 📌 Отзыв о JavaRush (Я его уже прошел около года назад и написал про него отзыв) 📌 Кучу практических задач по Java и SQL 📌 Мой личный роадмап для людей, которые только только начали свое обучение в Java 📌 Также у этого канала есть чат, где собираются единомышленники и опытные ребята, готовые помочь друг другу. Если у вас возникают вопросы по ходу обучения, не стесняйтесь, заходите и задавайте! Удачи всем в обучении, ребята! 🚀
Anonymous #3584408 Уровень 4
29 июля 2025
Скорей всего я сам разберусь раньше чем мне ответят. Но думаю другим поможет. Я вот понять не смог Если я правильно понял мы уже обозначили что считывает текс. str. Но следующая строка мы уже пытаемся считать цифры. в теории должна быть ошибка.(InputMismatchException). Хотя с другой стороны если в String идут только числа мы можем преобразовать строку в числа. Но нет такой строки.
3 августа 2025
А разве nextInt() не проверяет ест ли там число и переоброзовивает в число ?
Skoof Уровень 3
3 августа 2025
Прочитай лекцию в конце этого уровня про класс Scanner и все поймешь
Valdimir Уровень 11
6 августа 2025
Смотри, тут чуть-чуть другая тема, в лекции сказано, что можно вводить несколько чисел подряд в 1 строке, разделяя их пробелами, у нас эта строка заранее прописана, получается, что Scanner берет эти строки как числа и преобразует их в тип int, так как nextInt(), поэтому ошибки не будет. Надеюсь понятно объяснил...
Gris Hiver Уровень 1
27 июля 2025
❌ Ошибка. В Java нет перегрузки println, которая принимает несколько аргументов через запятую.

System.out.println(s3, "\n", s2.toUpperCase(), "\n", s1.toLowerCase());
✅Что работает:

System.out.println(s3 + "\n" + s2.toUpperCase() + "\n" + s1.toLowerCase());

System.out.println(s3);
System.out.println(s2.toUpperCase());
System.out.println(s1.toLowerCase());

System.out.println(String.format("%s\n%s\n%s", s3, s2.toUpperCase(), s1.toLowerCase()));

System.out.printf("%s\n%s\n%s\n", s3, s2.toUpperCase(), s1.toLowerCase());
Gris Hiver Уровень 1
27 июля 2025

int a = console.nextInt();
- console.nextInt() — читает следующее значение из ввода и пытается распарсить его как int. - если пользователь введёт, например, "42" — всё ок, a = 42. - НО если пользователь введёт "abc" или даже "4.5" (нецелое), произойдёт: ❌ InputMismatchException Программа упадёт с ошибкой, потому что "abc" нельзя превратить в int.

Exception in thread "main" java.util.InputMismatchException
	at java.util.Scanner.throwFor(Scanner.java:864)
	at java.util.Scanner.next(Scanner.java:1485)
	at java.util.Scanner.nextInt(Scanner.java:2117)
	at java.util.Scanner.nextInt(Scanner.java:2076)
	at Solution.main(Solution.java:6)
💡 Как этого избежать? Если хочешь обрабатывать невалидный ввод, нужно использовать console.hasNextInt():

if (console.hasNextInt()) {
    int a = console.nextInt();
    System.out.println("Введено число: " + a);
} else {
    System.out.println("Ошибка: введено не число");
}
Scanner по умолчанию использует пробельные символы как разделители (" ", \t, \n, \r). Все они работают для разделения значений.
01_dev Уровень 6
21 июля 2025
Привет! Как тебе эта тема? Лично мне она далась тяжело, но вроде суть усвоил, и все же было тяжело, одну задачу я и вовсе решил с 38 попытки
Anonymous #3585174 Уровень 33
24 мая 2025
good