Scanner пропускает nextLine после nextInt
nextInt() читает число и останавливается перед переводом строки, который появился от Enter. Следующий nextLine() видит этот перевод строки и сразу возвращает пустую строку — программа «пропускает» ввод.
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() ещё раз и ничего не сохраняйте — он заберёт перевод строки:
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:
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 с ними не работает.
Подводные камни
- То же с
nextDouble(),nextLong()иnext(). Все они оставляют перевод строки во вводе. Проблема появляется только при переходе наnextLine(): между двумяnextInt()переводы строк пропускаются сами. - Число и текст в одной строке. Если вводят
16 Иван Петроводной строкой, послеnextInt()вызовnextLine()вернётИван Петров— с пробелом в начале. Уберите его черезtrim(). - Не создавайте второй
ScannerнаSystem.in, чтобы «сбросить» ввод: первый мог уже прочитать часть данных в свой буфер, и они потеряются. ОдинScannerна всю программу. - Ввод закончился. Если строк больше нет,
nextLine()выбрасываетNoSuchElementException. Проверить заранее можно черезin.hasNextLine().