Синтаксис Java ·
‹ Предыдущий Следующий ›
⏱ 5 минут чтения Обновлено: 2026-07-04

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

1. Ввод через System.in

Для того чтобы пользователь мог что-то ввести с клавиатуры, существует стандартный поток ввода, представленный объектом System.in. Рассмотрим, как это происходит.

Для ввода данных с клавиатуры в Java используется метод System.in.read() - он возвращает код введенного символа. После его выполнения JVM останавливает программу и ждет, пока пользователь введет символ с клавиатуры. Для того чтобы вывести сам символ на консоль, выполняется его приведение к типу char:

public class SystemInExample {
    public static void main(String[] args) throws IOException {
        int x = System.in.read();
        char c = (char) x;
        System.out.println("Код символа: " + c + " = " + x);
    }
}

2. Класс Scanner

Конечно же, использовать System.in в чистом виде не очень удобно, если нам необходимо ввести не один символ, а целую строку. В этом случае можно воспользоваться классом Scanner. Этот класс находится в пакете java.util, поэтому его надо импортировать:

import java.util.Scanner;

Методы этого класса позволяют считывать строку, значение типа int или double

Методы класса Scanner:

  1. hasNextInt() - возвращает true если с потока ввода можно считать целое число.

  2. nextInt() - считывает целое число с потока ввода.

  3. hasNextDouble() - проверяет, можно ли считать с потока ввода вещественное число типа double.

  4. nextDouble() - считывает вещественное число с потока ввода.

  5. nextLine() - позволяет считывать целую последовательность символов, то есть строку.

  6. hasNext() - проверяет, а остались ли в потоке ввода какие-то символы.

3. Считывание чисел: nextInt() и hasNextInt()

В следующем примере метод hasNextInt() проверяет, ввел ли пользователь целое число. И с помощью метода nextInt() считываем введенное число. Если пользователь ввел строку, то программа выведет на консоль "Вы ввели не целое число":

import java.util.Scanner;

public class ScannerExample1 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Введите целое число: ");
        if (scanner.hasNextInt()) {
            int i = scanner.nextInt();
            System.out.println(i);
        } else {
            System.out.println("Вы ввели не целое число");
        }
    }
}

Важный нюанс.

Если после nextInt() (или nextDouble()) вызвать nextLine(), он считает пустую строку. Дело в том, что nextInt() считывает только число, но оставляет в буфере символ перехода на новую строку (\n), который вы нажали клавишей Enter. Следующий nextLine() тут же наткнётся на этот \n и вернёт пустую строку. Чтобы это обойти, после nextInt() добавляют «холостой» вызов nextLine(), который поглощает оставшийся перевод строки:

int age = scanner.nextInt();
scanner.nextLine(); // поглощаем остаток строки после числа
String name = scanner.nextLine(); // теперь строка считается правильно

4. Считывание дробных чисел: nextDouble()

Рассмотрим пример, в котором используется метод nextDouble() для считывания дробного числа. Если же пользователь введет строку, то программа завершится с ошибкой времени выполнения. Чтобы этого не происходило, перед вызовом метода nextDouble(), сделайте проверку с помощью метода hasNextDouble():

import java.util.Scanner;

public class ScannerExample2 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        // если ввести букву s,
        // то случится ошибка во время исполнения
        double i = scanner.nextDouble();
        System.out.println(i);
    }
}

Обратите внимание на локаль.

Метод nextDouble() использует разделитель дробной части в зависимости от региональных настроек системы. В русской локали разделителем является запятая, поэтому число нужно вводить как 3,14, а ввод 3.14 вызовет ошибку InputMismatchException. Чтобы Scanner всегда ожидал точку независимо от локали, можно задать её явно:

Scanner scanner = new Scanner(System.in);
scanner.useLocale(Locale.US); // точка как разделитель дробной части

5. Считывание строк: nextLine()

Следующий пример использует метод nextLine() для считывания всей строки:

import java.util.Scanner;

public class ScannerExample3 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s1, s2;
        s1 = scanner.nextLine();
        s2 = scanner.nextLine();
        System.out.println(s1 + s2);
    }
}

Часто задаваемые вопросы

Почему после nextInt() метод nextLine() считывает пустую строку?

Потому что nextInt() считывает только число, но оставляет в буфере символ перехода на новую строку (\n), который вы нажали клавишей Enter. Следующий вызов nextLine() сразу наталкивается на этот \n и возвращает пустую строку. Чтобы это обойти, после nextInt() добавляют дополнительный «холостой» вызов nextLine(), который поглощает оставшийся перевод строки.

Почему nextDouble() не читает число с точкой?

Метод nextDouble() использует разделитель дробной части в зависимости от локали системы. В русской локали разделитель — запятая, поэтому число вводится как 3,14, а ввод 3.14 вызовет ошибку InputMismatchException. Чтобы Scanner всегда ожидал точку, локаль можно задать явно через Locale.US.

В чём разница между next() и nextLine()?

Метод next() считывает только одно слово — до первого пробела или перевода строки. Метод nextLine() считывает всю строку целиком, включая пробелы, до нажатия Enter. Например, для ввода «Иван Иванов» next() вернёт только «Иван», а nextLine() — «Иван Иванов».

Зачем нужен метод hasNextInt() перед nextInt()?

Метод hasNextInt() проверяет, можно ли считать из потока ввода целое число, и возвращает true или false. Если сразу вызвать nextInt(), а пользователь введёт не число, программа завершится с ошибкой InputMismatchException. Проверка через hasNextInt() позволяет обработать некорректный ввод без аварийного завершения. Аналогично hasNextDouble() работает для дробных чисел.

Презентацию с видео можно скачать на Patreon.

Видео объяснение

Предпочитаете видеоформат? Посмотрите этот урок с примерами и объяснениями.

Комментарии

Зарегистрируйтесь или войдите, чтобы иметь возможность оставить комментарий.