JavaRush /Курси /Java Syntax Zero /Введення з клавіатури

Введення з клавіатури

Java Syntax Zero
Рівень 2 , Лекція 8
Відкрита

1. Читання з консолі, System.in

У попередніх лекціях ми ознайомилися з командами виведення на екран. Для цього ми використовували об'єкт System.out і його методи print() і println(). Просто і зручно.

Однак, як ви вже, напевно, здогадуєтеся, самого лише виведення на екран замало. Мета більшості програм — зробити щось корисне для користувача. Тому дуже часто є потреба в тому, щоб користувач міг вводити дані з клавіатури.

Так само як для виведення, для введення даних теж є спеціальний об'єкт — System.in. Але, на жаль, він не настільки зручний, як нам хотілося б. Цей об'єкт дає змогу зчитувати дані з клавіатури по одному символу за раз.

Ось чому ми скористаємося ще одним класом, який у парі з об'єктом System.in дасть нам усе, що потрібно. У Java вже давно є класи на всі випадки життя. З одним із них ми зараз і познайомимося.


2. Клас Scanner

Клас Scanner (повне ім'я java.util.Scanner) вміє зчитувати дані з різних джерел: консолі, файлів, інтернету. Якщо ми хочемо, щоб він зчитував дані з клавіатури, ми маємо передати йому об'єкт System.in як параметр — джерело даних. А об'єкт типу Scanner вже сам розбереться, що з ним робити.

Зчитування з клавіатури за допомогою об'єкта типу Scanner матиме приблизно такий вигляд:

Код Пояснення
Scanner console = new Scanner(System.in);
String name = console.nextLine();
int age = console.nextInt();
Створюємо об'єкт класу Scanner.
Читаємо з клавіатури рядок тексту.
Читаємо з клавіатури число.

На вигляд начебто нескладно, але чи так все просто насправді?

Гадаю, у вас виникла купа запитань, і зараз ми на них відповімо.

Але спершу наведемо приклад повної програми, в якій використовується клас Scanner:

import java.util.Scanner;
public class Solution {
   public static void main(String[] args)
   {
      Scanner console = new Scanner(System.in);
      String name = console.nextLine();
      int age = console.nextInt();

      System.out.println("Name: " + name);
      System.out.println("Age: " + age);
   }
}

3. Створення об'єкта Scanner

Перше запитання — що це за рядок Scanner console = new Scanner(System.in);?

Такий рядок може збивати з пантелику, проте вам будуть постійно траплятися подібні речі. Отже, здається, настав час пояснити, що тут написано.

Згадаймо, як ми зазвичай створюємо змінну з текстом:

String str = "текст";
Оголошення та ініціалізація рядкової змінної

Спочатку ми пишемо тип змінної (String), потім її ім'я (str) і, нарешті, після знака рівності пишемо значення.

У нашому дивному рядку насправді все так само:

Scanner console = new Scanner(System.in);
Оголошення та ініціалізація змінної типу Scanner

Усе, що записано ліворуч від знака рівності, — це оголошення змінної типу Scanner з іменем console. Можна було назвати її, наприклад, s або scanner, або навіть keyboard. Тоді код мав би такий вигляд:

Scanner s = new Scanner(System.in);
String name = s.nextLine();
int age = s.nextInt();
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int age = scanner.nextInt();
Scanner keyboard = new Scanner(System.in);
String name = keyboard.nextLine();
int age = keyboard.nextInt();

Гадаю, тепер усе стало набагато ясніше.

А от код, записаний праворуч від знака рівності, трохи складніший. Ідеться про new Scanner(System.in); Однак тут теж нічого надприродного немає.

У цьому коді ми кажемо Java-машині: створи новий об'єкт (слово new) типу Scanner і передай у нього як параметр те, звідки новостворений об'єкт Scanner братиме дані, — об'єкт System.in.

Після виконання всього цього рядка в нас з'явиться змінна з іменем console типу Scanner, за допомогою якої наша програма зможе зчитувати дані з клавіатури.


4. Виклик методів

У наведеному вище прикладі наша змінна console типу Scanner зберігала в собі посилання на об'єкт типу Scanner.

Щоб викликати методи об'єкта, на який посилається змінна, потрібно після імені змінної поставити крапку, а потім ім'я методу й параметри. Загальний вигляд цієї команди такий:

змінна.метод(параметри);
Виклик методу об'єкта, на який посилається змінна

Приклади:

System.out.println("Привіт");
System.out.println(1);

Якщо ви не плануєте передавати у функцію параметри, потрібно ставити просто порожні дужки:

змінна.метод();
Виклик методу без передавання параметрів

Приклад:

System.out.println();

5. Введення даних з консолі

Вводити дані з клавіатури, коли в нас є об'єкт типу Scanner, дуже легко.

Щоб зчитати з клавіатури рядок, потрібна команда

String str = console.nextLine();

Коли програма дійде до виконання цього рядка, вона зупиниться й очікуватиме, поки користувач уведе дані й натисне клавішу Enter. Після цього все, що ввів користувач, буде збережено в змінній str.

Щоб зчитати з клавіатури число, потрібна команда

int number = console.nextInt();

Тут усе аналогічно попередній команді. Коли програма дійде до виконання цього рядка, вона зупиниться й очікуватиме, поки користувач уведе дані й натисне клавішу Enter. Після цього все, що ввів користувач, буде перетворено на число і збережено в змінній number.

Якщо користувач увів дані, які неможливо перетворити на ціле число, виникне помилка в програмі, і вона завершиться.

Щоб зчитати з клавіатури дробове число, потрібна команда

double number = console.nextDouble();

Ця команда повністю аналогічна команді nextInt(), лише з тією різницею, що вона перевіряє, чи можна введені дані перетворити на число double.

Приклад програми, яка зчитує з клавіатури два числа й виводить їх суму:

import java.util.Scanner;
public class Solution {
   public static void main(String[] args)
   {
      Scanner console = new Scanner(System.in);
      int a = console.nextInt();
      int b = console.nextInt();

      System.out.println(a + b);
   }
}
Примітка

Користувач може ввести кілька чисел в одному рядку, розділивши їх пробілами: така ситуація буде коректно оброблена методами класу Scanner. Однак програма прочитає числа лише після того, як користувач натисне Enter.



6. Інші методи класу Scanner

Це, до речі, були не всі методи класу Scanner. Повний список матиме приблизно такий вигляд:

Метод Опис
nextByte()
Зчитує дані та перетворює їх на тип byte
nextShort()
Зчитує дані та перетворює їх на тип short
nextInt()
Зчитує дані та перетворює їх на тип int
nextLong()
Зчитує дані та перетворює їх на тип long
nextFloat()
Зчитує дані та перетворює їх на тип float
nextDouble()
Зчитує дані та перетворює їх на тип double
nextBoolean()
Зчитує дані та перетворює їх на тип boolean
next()
Зчитує одне «слово». Слова розділяються пробілами або Enter
nextLine()
Зчитує весь рядок

Крім того, є методи, які дають змогу перевірити тип іще не зчитаних даних (щоб знати, яким методом їх зчитувати).

Метод Опис
hasNextByte()
Там тип byte? Чи можна його перетворити на тип byte?
hasNextShort()
Там тип short? Чи можна його перетворити на тип short?
hasNextInt()
Там тип int? Чи можна його перетворити на тип int?
hasNextLong()
Там тип long? Чи можна його перетворити на тип long?
hasNextFloat()
Там тип float? Чи можна його перетворити на тип float?
hasNextDouble()
Там тип double? Чи можна його перетворити на тип double?
hasNextBoolean()
Там тип boolean? Чи можна його перетворити на тип boolean?
hasNext()
Там є ще одне слово?
hasNextLine()
Там є ще один рядок?

7. Введення даних з рядка

Ми вже говорили вище, що клас Scanner вміє зчитувати дані з різних джерел. І одне з цих джерел — рядок тексту.

Отакий вигляд це має:

String str = "текст";
Scanner scanner = new Scanner(str);

Замість об'єкта System.in ми під час створення об'єкта типу Scanner передаємо в нього рядок — str. І тепер об'єкт scanner буде зчитувати дані з рядка. Приклад:

Код програми: Пояснення:
import java.util.Scanner;
public class Solution {
   public static void main(String[] args)
   {
      String str = "10 20 40 60";
      Scanner scanner = new Scanner(str);
      int a = scanner.nextInt();
      int b = scanner.nextInt();

      System.out.println(a + b);
   }
}






// a == 10;
// b == 20;
На екран буде виведено: 30
Коментарі (45)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
Андрій Рівень 4
6 березня 2026
Scanner cola = new Scanner(System.in); int bottle = cola.nextInt(); Scanner pepe = new Scanner(System.in); int people = pepe.nextInt(); double rusult = bottle / people; System.out.println(rusult); так написав спочатку і досі не можу зрозуміти чому маємо ще на 1 помножити
Владислав Рівень 1
17 травня 2025
Добрий день! Як на мене замало практики. Якщо в кого є підручники з завданнями, дайте будь ласка)
Василь Рівень 4
8 жовтня 2025
не переймайтелся, ви ще клас Scanner не раз побачити на цьому курсі, і задач по ньому буде теж вистачати. Також далі буде розглядатися клас BufferedReader, можливо вам він більше сподобається. Хоча, враховуючи дату вашого коментаря, ви вже самі до того всього дійшли :)
hidden #3500645 Рівень 30
29 вересня 2024
Доброго дня. Чи може хтось підказати щодо помилки в Eclipse на рядок Scanner scanner = new Scanner(System.in); підсвічує Configure problem severity: Open the Java > Compiler > Errors/Warnings preference page and highlight the problem to configure its severity. Problem: Resource leak: 'scanner' is never closed Програмка працює, проте warning на строчці трошки бісить
hidden #3500645 Рівень 30
29 вересня 2024
Розібралася, можливо комусь допоможе, бо про це у лекції, на жаль, не йдеться, можливо десь у подальшому пояснюватиметься детальніше. У кінці програми потрібно додати scanner.close(); і помилка зникне.

import java.util.Scanner;
public class test {
   public static void main(String[] args)
   {
      String str = "10 20 40 60";
      Scanner scanner = new Scanner(str);
      int a = scanner.nextInt();
      int b = scanner.nextInt();
      System.out.println(a + b);
      scanner.close();
   }
}

import java.util.Scanner;
public class test {
   public static void main(String[] args)
   {
      Scanner keyboard = new Scanner(System.in);
      int a = keyboard.nextInt();
      int b = keyboard.nextInt();

      System.out.println(a + b);
      keyboard.close();
   }
}
Гаркін Рівень 14
4 лютого 2024
Скопіював приклад до Eclipse . Приклад з рядком Scanner console = new Scanner(System.in); Отримав повідомлення про помилку. Multiple markers at this line - Scanner cannot be resolved to a type - Scanner cannot be resolved to a type Перша реакція : "Шо за хня?!". Перевіряю текст, читаю коменти, перевіряю текст-приклад. І зверху є рядочок import java.util.Scanner; Додаю. Працює. Хм... Сподіваюсь про цей імпорт будуть далі розмовідати. Доп. А усе рівно не працює. Помилка "Resource leak: 'console' is never closed". І два System.out.println нічого не друкують (бо нічого не введено?). Читаємо далі. Доп2. Розібрався. Запускаємо приклад, переходимо у консоль (тобто мишою там клікаємо), вношу туда текст (обов’язково натиснути Enter (!!)), вношу число (обов’язково Enter), отримуємо текст: Name: приклад Age: 17 Ну я якщо внести число, а потім текст, то отримуюємо при виконанні помилку. Ок
Олексій Рівень 1 Expert
23 березня 2023
Для початківця, який почав вивчати програмування лише з курсу JavaRush не зовсім зрозуміло, що таке об'єкт. Але, припустимо, це якесь абстрактне поняття, суть якого буде детальніше розглядатись пізніше. Проте для засвоєення конкретно ціє лекції важливо зрозуміти одне питання. Цитата: "Scanner console = new Scanner(System.in); Усе, що записано ліворуч від знака рівності, — це оголошення змінної типу Scanner з іменем console " То, що ми створюємо? Об'єкт? Чи змінну console? Після довгих міркувань та перечитувань, складається враження, що створюємо і те і те. Тоді, для завершенної картинки у голові мені не вистачає відповіді на питання: "Якщо ми свторюємо змінну console, то як будет називатись об'єкт, який створюється одночасно із цією змінною?". Якщо мої міркування не вірні, будь вдячний за більш розширену відповідь.
Lazy Initialization Рівень 36 Expert
31 березня 2023
дійсно, про об'єкти буде трохи пізніше, на 11 рівні) якщо коротко: то є класи (шаблони, які описують якусь логіку), у класів є змінні, а ще є методи, які вміють цю логіку виконувати. У класу Scanner є багато методів. Наприклад, метод nextInt() вміє зчитувати дані і перетворювати їх на цілі числа. Для того, щоб викликати цей метод (тобто скористатися), потрібно створити об'єкт (екземляр) класу Scanner. І тут дуже цікавий момент. Команда: Scanner console = new Scanner(System.in); - дійсно створює і змінну типу Scanner, і об'єкт класу Scanner. Але змінній присвоюється не сам об'єкт, а лише посилання (адреса в пам'яті) на нього. У попередній лекції написано детальніше про адресацію пам'яті. І тому, щоб звернутись до об'єкту класу Scanner і викликати його методи, потрібно звернутись до змінної, яка знає, як цей об'єкт знайти (у даному випадку це змінна console).
Олексій Рівень 1 Expert
1 квітня 2023
Щиро дякую!
Vitalii Рівень 11
27 липня 2023
<тип даних> <назва змінної> = <значення>

Scanner console = new Scanner(System.in);
Scanner - тип даних, він же клас console - назва змінної new Scanner(System.in) - значення (власне створить об'єкт сканера який попаде у змінну. Об'єкт має методи які будуть виконуватись. Для виклику методів ви їх пишете через крапку.) Порівняйте із рядком:

String greeting = "Hello world!";
String - тип даних, він же клас greeting - назва змінної "Hello world!" - значення, просто тут без ключового слова new. Питання в іншому, нащо було в java'i вигадувати якісь базові типи, якщо просто можна було зробити все об'єктами і не створювати цеї дихотомії.
De Stroy Рівень 10
4 квітня 2024
Якщо все було б об'єктом, тоді навіть для елементарних арифметичних чи логічних операцій, потрібно було створювати об'єкт, потім викликати метод об'єкту, потім займатися garbage collection і тд. Окрім цього, класи містить додаткові мета-дані, що збільшує необхідну пам'ять для їх зберігання (int vs Integer, наприклад). А оскільки Java притримується принципу WORA - write once, run anywhere, то програми Java мають запускатися на пристроях із обмеженими ресурсами. Примітивні типи створюються в стеку, а для об'єктів виділяться пам'ять на купі (heap), доступ до stack швидший за heap. У Java нічого не вигадували, ця мова базується на родині мов C (С++), де також є поняття "базових" та більш складних типів. І щоб цим програмістам легше було переходити на Java, вирішили залишити чимось схожу систему типів. Врешті решт, одним з принципів Java є Security and Predictability, а примітивні типи незмінні (immutable), а також передаються до функцій за принципом pass-by-value і таким чином Java переконана в безпечності базових типів, а також в їх поведінці, яку можна прогнозувати.
qojqva Рівень 10
19 січня 2023
у кожному завданні при виконанні, коли я пишу System.out.printIn(), мені видає помилку і завдання я часто не закінчую тупо із-за того, що я написав правильний код, а перевірка мені вказує на цю помилку, хоча її там начебто немає, навіть коли дивлюсь правильний код у підтримці код не відрізняється від мого, але помилка зараховується.
qojqva Рівень 10
19 січня 2023
Все, гайси, я роздуплився, не і а л треба писати у "println"
Anonymous #3262541 Рівень 12
14 лютого 2023
дурбелик)
Василь Рівень 4
22 листопада 2022
тут не дуже зрозуміло: Примітка Користувач може ввести кілька чисел в одному рядку, розділивши їх пробілами: така ситуація буде коректно оброблена методами класу Scanner. Однак програма прочитає числа лише після того, як користувач натисне Enter. Хоча коли дочитаєш статтю, то там в прикладі про це йдеться.
Василь Рівень 4
22 листопада 2022
Scaner набагато зручніше ніж BufferedReader
les_yeux_blancs Рівень 50
16 квітня 2023
BufferedReader слугує зовсім іншій меті, а для читання з консолі Scanner буде кращий в 99 зі 100 випадків
kotkokos Рівень 4
17 вересня 2022
Звідки java знає що "int a = scanner.nextInt();" = 10, а "int b = scanner.nextInt();" = 20?
Illia Рівень 8
24 вересня 2022
ось звідки
Oleksii Klym Рівень 11
25 вересня 2022
ну це не пояснення точно.........
Oleksii Klym Рівень 11
25 вересня 2022

 public static void main(String[] args) {
        String str = "10 20 40 60";
        Scanner scanner = new Scanner(str);
        int a = scanner.nextInt();
        int c = scanner.nextInt();
        int b = scanner.nextInt();

        System.out.println(a + b);
тепер результат буде 50 а не 30. Наскільки я розумію, scanner.nextInt() зчитує зліва на право перше число до першого пробілу(можливо і до крапки теж, так як це не ціле число).
Oleksandr Рівень 6
19 листопада 2022
10 та 20 це ті числа що вводить користувач
Alexoria Рівень 12
20 грудня 2022
ні, в данному випадку змінна str отримує строку "10 20 40 60", записуючи це все в пам*ять. Далі строка str з данними "10 20 40 60" передається Scanner (сканеру). Далі оголошуються змінні а, с і b, які зчитують зліва направо числа. З пройденого раніше матеріалу ми знаємо, що: 1 - можлива конвертація з типу String в int, а також 2 - зчитування починається з 0 (в нашому випадку 0 - це 10, початок відліку). Тому змінним а передається число 10, с - 20 і b - 40. При питанні, чому вони не зчитують постійно 10 (адже це початок), відповідь: інтеджер а (int a) вже записав в пам*ять число 10, після чого зчитування продовжується (хоча логічніше сказати починається з 0 заново, проте 10 вже було переписано в пам*ять int a, тому умовний початок тепер - число 20. А після запису числа 20 в int c, початком буде 40, і так далі), після чого int c записує число 20 до себе та int b записує 40 до себе, сподіваюсь так зрозуміліше
Yaroslav Рівень 1
16 липня 2023
Вельми вдячний!!
Pan Vitali Moroz Рівень 51
1 вересня 2022
Якщо задача не проходить перевірку треба первірити задачу