Глиф Учебники

Scanner пропускает nextLine после nextInt

Справочник · Java · 1 минута чтения

nextInt() читает число и останавливается перед переводом строки, который появился от Enter. Следующий nextLine() видит этот перевод строки и сразу возвращает пустую строку — программа «пропускает» ввод.

Java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int age = in.nextInt();
        String name = in.nextLine();
        System.out.println(age + " [" + name + "]");
    }
}
Ввод
16
Иван Петров
Вывод
16 []

Строка «Иван Петров» так и осталась непрочитанной: nextLine() вернул остаток первой строки после числа — пустоту.

Как исправить

Подойдёт любой из двух способов — выберите один. Первый — быстрая правка готовой программы, второй надёжнее в новой.

Дочитать строку после числалишний nextLine()

После nextInt() вызовите nextLine() ещё раз и ничего не сохраняйте — он заберёт перевод строки:

Java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int age = in.nextInt();
        in.nextLine();
        String name = in.nextLine();
        System.out.println(age + " [" + name + "]");
    }
}
Ввод
16
Иван Петров
Вывод
16 [Иван Петров]

Дальше: «Подводные камни»

Читать всё через nextLineи переводить в число

Читайте каждую строку целиком, а числа получайте из строки через Integer.parseInt:

Java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int age = Integer.parseInt(in.nextLine().trim());
        String name = in.nextLine();
        System.out.println(age + " [" + name + "]");
    }
}
Ввод
16
Иван Петров
Вывод
16 [Иван Петров]

Так перепутать порядок чтения невозможно: каждая строка ввода читается одним nextLine(). trim() убирает случайные пробелы по краям — parseInt с ними не работает.

Подводные камни