Введение
Сегодняшнее у нас по плану особое занятие — мы будем учить программу слышать и понимать нас! Раньше наши программы были как монологи: запустили, они что-то сделали и завершились. Теперь же мы научим их вести диалог — реагировать на то, что мы вводим с клавиатуры. И главным помощником в этом нам станет класс Scanner!
Исторически, в первых версиях Java считывать ввод с консоли было не так просто. Разработчикам приходилось использовать громоздкие конструкции с InputStreamReader и BufferedReader, писать много дополнительного кода. Всё изменилось с приходом Java 5.0 — в него и добавили класс Scanner, который сильно упростил жизнь всем, кто работает с вводом данных. Это был настоящий прорыв в удобстве!
Представь, что Scanner — это твой личный цифровой помощник, который стоит между программой и пользователем. Его главная задача — принимать информацию, которую вводит человек (будь то числа, слова или целые предложения), аккуратно её разбирать на составляющие (этот процесс называется токенизацией) и передавать уже в понятном для программы виде — в виде чисел, строк или других типов данных.
Он умный и предусмотрительный. Прежде чем что-то считать, он всегда может проверить: «А то, что ты хочешь прочитать, точно является числом?» (метод hasNextInt()). Это помогает избежать множества ошибок.
И да, ты правильно провёл аналогию с hardware-сканером! Принцип очень похож: обычный сканер считывает физический документ и создаёт его цифровую копию. Наш же, программный Scanner, считывает введённый пользователем текст и преобразует его в цифровые данные, с которыми уже может работать программа.
Так что сегодня мы не просто изучим новый класс, а по-настоящему оживим наши программы, наделив их способностью к интерактивному общению.
class Scanner
Отлично, теперь давайте научимся вводить данные с клавиатуры. Для этой цели служит специальный сканер. Он умеет считывать данные из разных источников. В том числе и с клавиатуры. Для его создания используется строка:
Scanner sc = new Scanner(System.in);
Можем уже заметить знакомый шаблон создания переменной: сначала указывается тип данных (Scanner), а потом название переменной (sc), другими словами, создается объект класса Scanner, но об этом я расскажу уже в другой статье.
Для того, чтобы мы смогли создать нашу переменную типа Scanner надо сначала импортировать этот тип (подключить к нашей программе). Для этого до создания класса пропишем строку:
import java.util.Scanner;
Думаю, что теперь понятно как создать этот сканер, но как с ним работать? Давайте приведу такой пример, чтобы переменная
String s1, принимала значение введенное пользователем в терминал, нам нужно написать next. и дописать тип переменной.
Так например:
String s1 = sc.next(); // считает строку до первого пробела
String s2 = sc.nextLine(); //считает следующую строку полностью
int i = sc.nextInt(); //считает слудующую строку, которая должна содержать число
double d = sc.nextDouble();
float f = sc.nextFloat();
boolean b = sc.nextBoolean();
и т.д
Как вы поняли, каждая из таких команд считывает соответствующий тип данных.
Давайте посмотрим, как выглядит программа для считывания двух целых чисел и поиска их суммы:
import java.util.Scanner;
public class Prog {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
System.out.println(a + b);
}
}
Ниже представлен вывод в консоли, как вы видите я ввел два числа
переменная int a присваивает себе значение 1, а
переменная int b присваивает себе значение 4
a+b или теперь уже 1+4, как раз дает 5
Обратите внимание на самую первую строчку программы. Она нужна для подключения этого самого сканера, так как его нет среди стандартных команд Java. Со временем подобные подключения мы будем встречать гораздо чаще.
Ошибки которые могут быть
Это уже больше похоже на настоящий сканер! Программа просит пользователя ввести в строку любое число. После того, как пользователь это сделал, программа благодарит его, выводит на консоль итог своей работы и завершается.
Но у нас осталась одна серьезная проблема. Пользователь может ошибиться и ввести что-то не то.
Вот пример, когда наша текущая программа перестанет работать:
import java.util.Scanner;
public class Prog {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
System.out.println(a + b);
}
}
Вы наверняка посмотрели на код, не нашли синтаксической ошибки, и пошли сверять его с прошлым. Так вот, это один и тот же код, но он вызывает ошибку.
У нас переменная a и b указаны с типом int, это означает что я должен был ввести число, но я ввел строку, и в консоли появилась не цензурная речь.
Чтобы избежать ошибок при вводе данных пользователем, полезно предусмотреть проверку введенной информации. Например, если пользователь вводит что угодно, кроме числа, стоит вывести предупреждение о некорректном вводе, а при правильных данных — подтвердить успешное принятие информации.
Метод hasNexInt()
Для этого в Java у Scanner есть мощные инструменты — специальные методы, которые позволяют “заглянуть в будущее” и определить, какие данные ожидают в следующем вводе. Среди них — hasNextInt(), который проверяет, является ли следующий фрагмент данных целым числом. Он возвращает true, если это так, и false, если нет.
Аналогично работают и другие методы:
- hasNextLine() — проверяет, есть ли следующая строка для чтения;
- hasNextByte(), hasNextShort(), hasNextLong(), hasNextFloat(), hasNextDouble() — все предназначены для определения типа следующего вводимого значения.
Эти функции позволяют сделать программу более устойчивой и дружелюбной к пользователю, своевременно реагируя на некорректный ввод и избегая ошибок выполнения.
Исправленный код:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
if(sc.hasNextInt()){
int a = sc.nextInt();
int b = sc.nextInt();
System.out.println(a + b);
} else {
System.out.println("Извините, вы ввели не число, попробуйте еще раз");
}
sc.close();
}
}
С помощью метода hesNexInt, мы проверяем, число ли в следующей строке, если да, то вводим еще число.
Результаты проверки:
Я ввел какой-то текст и мы увидели ошибку, дальше у меня даже не было возможности написать число.
Метод close()
В этом же примере есть еще один метод, на который нужно обязательно обратить внимание — close(). Как и любой объект, работающий с потоками ввода-вывода, сканер должен быть закрыт по завершении своей работы, чтобы больше не потреблять ресурсы нашего компьютера.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
if(sc.hasNextInt()){
int a = sc.nextInt();
int b = sc.nextInt();
System.out.println(a + b);
} else {
System.out.println("Извините, вы ввели не число, попробуйте еще раз");
}
sc.close(); //Вот он маленький и не заметный
}
}
Никогда не забывай о методе close()!
Краткий итог
Итак, какие у нас результаты?
- Отчитываюсь: "Выполнена большая работа, учили class Scanner и его методы, урок пройдет, пострадавших нет"
Спасибо тебе за то, что прочел статью до конца, именно для таких как ты я делаю статьи, хорошего дня)