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);
      System.out.println("Вік: " + 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

Коментарі (44)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
Владислав Рівень 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
Якщо задача не проходить перевірку треба первірити задачу
Anonymous #696530 Рівень 19
1 липня 2022
В першій задачі додав трохи тексту типу "Рядок 1:, Рядок 2:" при виводі, і остання умова завдання не виконувалася.