Ввод с клавиатуры
Программа становится интереснее, когда она отвечает пользователю. В Java 25 прочитать строку с клавиатуры можно одним вызовом IO.readln(), а в старом коде для этого используют класс Scanner.
IO.readln
IO.readln() выводит подсказку, ждёт, пока пользователь наберёт текст и нажмёт Enter, и возвращает введённое как String:
void main() {
String name = IO.readln("Как вас зовут? ");
IO.println("Привет, " + name + "!");
}Результат (пользователь ввёл Анна):
Как вас зовут? Анна
Привет, Анна!Программа остановится на readln() и будет ждать ввода. Без аргумента IO.readln() читает строку без подсказки.
Ввод чисел
readln() всегда возвращает строку, даже если пользователь набрал цифры. Чтобы считать с ними, строку превращают в число через Integer.parseInt():
void main() {
int year = Integer.parseInt(IO.readln("Год рождения: "));
IO.println("В 2030 году вам будет " + (2030 - year));
}Результат (пользователь ввёл 1995):
Год рождения: 1995
В 2030 году вам будет 35Для дробных чисел используйте Double.parseDouble(). Если пользователь введёт не число, parseInt() выбросит исключение NumberFormatException — такой пример есть в уроке о преобразовании типов.
Несколько значений
Каждый вызов readln() читает одну строку, поэтому несколько значений просто читают по очереди:
void main() {
int a = Integer.parseInt(IO.readln("Первое число: "));
int b = Integer.parseInt(IO.readln("Второе число: "));
IO.println("Сумма: " + (a + b));
}Результат (пользователь ввёл 7 и 5):
Первое число: 7
Второе число: 5
Сумма: 12Scanner
До Java 25 ввод читали классом Scanner. Его создают один раз, передав System.in — поток ввода с клавиатуры. Метод nextLine() читает строку, nextInt() — целое число:
void main() {
Scanner scanner = new Scanner(System.in);
IO.print("Сколько чашек кофе? ");
int cups = scanner.nextInt();
IO.println("К оплате: $" + cups * 3);
}Результат (пользователь ввёл 2):
Сколько чашек кофе? 2
К оплате: $6В короткой форме программы Scanner доступен сразу. В классической форме в начале файла нужна строка import java.util.Scanner;.
Частая ошибка
nextInt() читает только число, а перевод строки после него остаётся во вводе. Следующий nextLine() подхватывает этот остаток и сразу возвращает пустую строку:
void main() {
Scanner scanner = new Scanner(System.in);
IO.print("Возраст: ");
int age = scanner.nextInt();
IO.print("Имя: ");
String name = scanner.nextLine();
IO.println("[" + name + "], " + age);
}Результат (пользователь ввёл 30 и нажал Enter):
Возраст: 30
Имя: [], 30Программа даже не дала ввести имя. Вызовите лишний scanner.nextLine() после nextInt() или читайте всё через IO.readln() и Integer.parseInt() — так этой проблемы нет.