Блок 1. Раздел 2. Тема 1.

Класс Scanner.
Считывание чисел
с клавиатуры

В этой теме мы научимся считывать в программу числа, которые пользователь вводит с клавиатуры. Мы сможем попросить пользователя ввести любые данные, а потом правильно на них отреагировать. В будущем совершенно аналогично чтению с клавиатуры класс Scanner можно будет использовать, чтобы читать текст из файлов и из каналов интернет-связи.
Когда вы записали в переменную число, вы можете делать с ним всё что угодно. Это мог быть ответ человека на вопрос теста типа «Сколько будет 7*7?» Это мог быть ответ на вопрос типа «Выберите первое, второе или третье действие», и программа выполнит выбранное действие. Это могли быть входящие данные типа «Введите значение скорости поезда и длину пути, и программа ответит вам, когда он прибудет в такой-то город». Это бывает нужно постоянно – программы считывают данные от пользователей, и ввод данных с клавиатуры просто необходим.

В целом раздел 2 будет посвящен считыванию данных с клавиатуры и оператору if, с помощью которого можно будет указать "если верно условие, то делать то-то". Также мы пройдём, какие для этого оператора бывают логические условия, узнаем альтернативу оператору "если" - switch. На основе этих инструментов мы сделаем программу-тест и калькулятор.

Считывание чисел, слов, данных с клавиатуры или из файла часто называют сканированием, поэтому в Java за сканирование отвечает класс Scanner. Рассмотрим код:

// Сравните 2 строчки кода:
// объявить x типа int и приравнять числу 10
int x = 10;  
// объявить myscan класса Scanner и приравнять новому Сканеру
Scanner myscan = new Scanner (System.in); 

// Как видите, наш класс очень похож на тип int. 
// На самом деле, класс - это просто набор данных в одном названии.
Сравните эти две строчки кода. Первая строчка гласит:

int x = 10; 
// Объявить переменную типа int с именем x, равную начальному значению 10. 

Вторая гласит:

Scanner myscan = new Scanner (System.in); 
/* Объявить объект класса Scanner с именем myscan, равный новому сканеру с параметром System.in */
Это очень похожие вещи. Сначала мы указываем имя класса Scanner, точно также как обычно мы указываем имя типа int. После этого идет новое имя – мы называем конкретное целое число именем x, и называем конкретный сканер именем myscan.

После знака равно идет начальное значение – для переменной это просто 10, а вот для сканера мы должны использовать new. Этот оператор означает «создать новый» или более точно «заказать память под новый объект». На самом деле, при объявлении переменной под неё тоже заказывается память, но здесь памяти требуется больше и поэтому мы заказываем память явно именем new. После new идет имя класса, под который нужно заказать память – мы хотим сканер и указываем Scanner. В скобках идут уточняющие параметры – какой именно сканер.

В данном случае указываем параметром System.in. Это поток ввода текста с клавиатуры. In – с английского ввод, out – с английского вывод. System.out – поток вывода текста на экран. System.in – поток ввода текста с клавиатуры. Слово поток просто значит, что он считывает не одну клавишу, а последовательность нажатых клавиш.

В общем случае это выглядит так:
Scanner имя = new Scanner (System.in);
Чтобы Java нашла класс Scanner, нужно его импортировать в проект или проще говоря включить. Это делается управляющей строчкой, поставьте её выше main в самом верху своего кода сразу после самой первой строчки package:

import java.util.Scanner;  // в начале кода после package 
Так мы включаем для себя класс Scanner. Так же мы всегда будем подключать и другие библиотеки, классы и вообще возможности.

Когда не знаете, что импортировать для того или иного класса, просто забейте в гугл "Java имя_класса import" и быстро найдете результат. Также все стандартные классы Java описаны в официальной документации, например, класс Scanner и все его функции описаны тут - https://docs.oracle.com/javase/10/docs/api/java/util/Scanner.html

Среда разработки также подсказывает, что нужно импортировать для того или иного класса - нажмите на покрасневшее имя нового класса правой кнопкой мыши, и выберите "импортировать класс". Так строчка импорта появится сама собой. В некоторых средах разработки конкретные кнопки отличаются, но суть та же.

Объявив переменную х, мы можем дальше ей пользоваться. Так и теперь, объявив объект myscan, мы можем его использовать, чтобы читать данные с клавиатуры. Например, «считать следующее целое» (по-английски "next int") будет так:

int x = myscan.nextInt ();

// Расшифровка: 
// int x = число, считанное с клавиатуры; 
// объявить целое y, равное результату функции nextInt.
Здесь мы запускаем функцию nextInt () для объекта myscan. Точка между ними означает принадлежность nextInt к myscan. Круглые скобки как и всегда для функций означают «выполнить функцию с данным именем».

Функция nextInt класса Scanner считывает цифры, вводимые с клавиатуры и преобразует их в целое число. Она считывает их до ближайшего разделителя, т.е. пробела или enter. Она останавливает работу приложения до тех пор, пока человек не введет число на клавиатуре. То есть, например, если вы запустили myscan.nextInt () и ушли от компьютера, то он и через 10 лет будет ожидать, когда вы введете число и нажмете enter.

Аналогично nextDouble () возвращает дробное число, а функция next () возвращает одно слово как строку String. Со строками мы научимся работать в ближайших уроках.

Пример:

int a = myscan.nextInt (); // сначала считать целое и сохранить в a 

double b = myscan.nextDouble (); // далее считать дробное в b 

int c = myscan.nextInt (); // наконец считать ещё целое в c 
В общем случае для int и double это выглядит так:
тип имя = myscan.nextТип ();
Если человек введёт вместо цифр что-то другое - буквы или другие символы - то функция nextDouble "кинет исключение". Кинуть исключение - значит остановить программу с сообщением об ошибке. Ошибка может выглядеть так: "Exception in thread main java.util.InputMismatchException ... at java.util.Scanner.nextDouble". В описании ошибки (его ещё называют log программы) может быть очень много текста, но ваша задача найти самый понятный ключевой кусок. Например, InputMismatchException переводится как "исключение - несоответствие ввода", а дальше "at java.util.Scanner.nextDouble" означает "при Scanner.nextDouble". Значит речь шла о неправильно введённом дробном числе.
В будущем мы научимся "ловить" (программное слово catch) исключения, которые "кинула" (программное слово throw) программа, то есть корректно реагировать на ошибку. Например, попросить пользователя ввести число заново, если он ввёл что-то не то. Имейте в виду, что "неправильным" символом может оказаться банальная точка в дробном числе - в Америке для этого используется запятая, а в России точка, и иногда возникает путаница. Программу можно настроить, чтобы она считывала числа так, как вы хотите, но для начала просто имейте в виду, что если дробное число не считывается через точку, то можно попробовать вместо неё ввести запятую.
Самое главное мы уже освоили. Теперь время решать задачи. Ответьте на несколько вопросов, чтобы лучше усвоился новый материал:
Задача 1. Как будет работать и что будет выдавать данная программа на экране?

package javaapplication5;
import java.util.Scanner;
public class JavaApplication5 {
    public static void main(String[] args) {
        Scanner myscan = new Scanner (System.in);
        
        System.out.println ("Привет!");
        System.out.println ("Введи первое число");

         double x = 0;
         x = myscan.nextDouble (); 

         double y = 0;
         y = myscan.nextDouble ();

         System.out.println (x + y);
    }             
}
Решайте больше задач по этому разделу здесь.
В следующей теме расскажем, как считывать одиночные символы, а не только целые слова