W tym artykule dowiesz się, jak w języku Java wprowadzać dane do programu z klawiatury, przy pomocy klasy Scanner. Dzięki tej wiedzy będziesz umieć tworzyć programy, wykonujące tę samą operację dla różnych danych wejściowych.
Wszystkie artykuły z cyklu “Kurs Java”:
- Przygotowanie środowiska do pracy z Javą.
- Pierwszy program – zlicz ile znaków, jest w tekście.
- Scanner, wprowadzanie danych z klawiatury.
- Instrukcja warunkowa – IF
- Pętla for w języku Java
- Tablice w Javie – przechowywanie zbioru wartości
- Obiektowość – klasa, pole, metoda, obiekt
Klasa Scanner
Wiemy już, że w Javie jest taka konstrukcja jak klasa. Zdefiniowaliśmy też już pierwszą klasę, która nazywała się “Program”. Standardowa biblioteka Javy dostarcza nam bardzo wiele klas z gotowymi implementacjami. Jedną z nich jest klasa Scanner.
“Klasa Scanner odczytuje sformatowane dane wejściowe i konwertuje je do postaci binarnej. Klasa może być używana do odczytywania danych wejściowych z konsoli, pliku, łańcuchów […]. Przykładowo możemy wykorzystać tę klasę do odczytywania liczb z klawiatury i przypisywania jej do odpowiedniej zmiennej”
H. Schildt, Java Kompendium Programisty
No dobrze, polecieliśmy teraz regułką 🙂 Wygląda profesjonalnie, ale o co chodzi… 🙂 Jak tego użyć?
Najpierw wytłumaczmy, czym jest zmienna, o której była mowa w cytacie.
Zmienna
Zmienna służy do przechowywania danych.
Konstrukcja deklaracji (stworzenia) zmiennej:
typ_danych nazwa_zmiennej;
Aby stworzyć zmienną w Javie, należy określić jej typ oraz nazwę. Jakie mamy typy w Javie? O tym za chwilę.
Konstrukcja inicjalizacji (ustawienia wartości) zmiennej:
nazwa_zmiennej = wartość;
Typy danych
Java definiuje 8 podstawowych typów danych, tzw. typów prostych, które możemy podzielić na 3 grupy:
Całkowitoliczbowe (np. 66)
- byte – liczby z przedziału od -128 do 127
- short – liczby z przedziału od -32 768 do 32 767
- int – liczby z przedziału od ok – 2 mln do 2 mln
- long – liczby z przedziału od ok – 9 tryliardów do 9 tryliardów
Zmiennoprzecinkowe (np. 3.14)
- float – liczby z przedziału 1.4e-045 do 3.4e+038
- double – liczby z przedziału 4.9e-324 do 1.8e+308
Znakowy (np. ‘c’)
- char
Logiczny (true lub false)
- boolean
Poza typami prostymi wyróżniamy też typy referencyjne, jednym z nich jest String, który służy do przechowywania całych zdań.
Super, poznaliśmy podstawowe typy danych w Javie, możemy więc zacząć tworzyć zmienne.
Ćwiczenie 1. Stwórz zmienne: imię, wiek oraz pensja. Przypisz do nich wartości oraz wyświetl na konsoli.
Otwórz projekt Program.java, w miejscu, w którym zakończyliśmy. W metodzie main dodaj zmienne:
// deklaracja zmiennych String imie; int wiek; double pensja; // inicjalizacja zmiennych imie = "Jurek"; wiek = 22; pensja = 4445.11;
Wyświetl wartość zmiennych
System.out.println("Imię "+imie); System.out.println("Wiek "+wiek); System.out.println("Pensja "+pensja);
Konstrukcja “Imię “+imie, łączy słowo “Imię ” z wartością zmiennej imie. A więc wynikiem będzie połączony napis: “Imię Jurek”.
Program.java
class Program { public static void main (String args[]) { System.out.println("Dzisiaj jest piękny dzień.".length()); // deklaracja zmiennych String imie; int wiek; double pensja; // inicjalizacja zmiennych imie = "Jurek"; wiek = 22; pensja = 4445.11; System.out.println("Imię "+imie); System.out.println("Wiek "+wiek); System.out.println("Pensja "+pensja); } }
Przyszedł czas na kompilację oraz uruchomienie programu. W katalogu, w którym znajduje się plik “Program.java” wpisz w konsoli:
javac Program.java java Program
Powinniśmy otrzymać następujący wynik:

Poznaliśmy typy oraz zmienne, możemy zatem wrócić do klasy Scanner, która umożliwia wczytywanie danych i zapisywanie ich do zmiennych.
Wczytywanie danych z klawiatury (Scanner cd.)
Aby skorzystać ze “skanera” należy utworzyć zmienną typu Scanner i zainicjalizować go, przekazując “standardowe wejście”.
Standardowe wejście (System.in) domyślnie ustawione jest jako klawiatura. Standardowe wyjście (System.out) domyślnie ustawione jest jako konsola.
Stworzenie instancji skanera:
Scanner scanner = new Scanner(System.in);
Scanner jest zewnętrzną klasą (niezdefiniowaną przez nas), aby jej użyć, należy wykonać import. W Javie importy definiujemy na samym początku pliku, jeszcze przed deklaracją klasy.
Wpisz następujący kod na samym początku pliku Program.java
import java.util.Scanner;
Ok, przygotowaliśmy skaner, ale jak z niego skorzystać?
Klasa Scanner udostępnia metody, które umożliwiają sczytywanie z klawiatury wartości różnych typów, np.:
- Jeśli chcesz sczytać liczbę całkowitą, to wywołaj:
scanner.nextInt()
- jeśli chcesz sczytać tekst, to wywołaj
scanner.next()
Listę wszystkich metod udostępnianych przez klasę Scanner możesz znaleźć w dokumentacji javy.
Aby sczytaną wartość przypisać do zmiennej, wywołaj odpowiednio:
imie = scanner.next(); wiek = scanner.nextInt(); pensja = scanner.nextDouble();
Aby poczuć interakcję z programem, możemy dodać odpowiednie pytania, które będzie zadawał nam program.
Scanner scanner = new Scanner(System.in); System.out.println("Podaj imię: "); imie = scanner.next(); System.out.println("Podaj wiek: "); wiek = scanner.nextInt(); System.out.println("Podaj pensję: "); pensja = scanner.nextDouble();
Cały kod programu:
import java.util.Scanner; class Program { public static void main (String args[]) { System.out.println("Dzisiaj jest piękny dzień.".length()); // deklaracja zmiennych String imie; int wiek; double pensja; // inicjalizacja zmiennych, poprzez wczytanie z klawiatury Scanner scanner = new Scanner(System.in); System.out.println("Podaj imię: "); imie = scanner.next(); System.out.println("Podaj wiek: "); wiek = scanner.nextInt(); System.out.println("Podaj pensję: "); pensja = scanner.nextDouble(); System.out.println("Imię "+imie); System.out.println("Wiek "+wiek); System.out.println("Pensja "+pensja); } }

Mamy to!
Zmodyfikujmy program sprawdzający długość tekstu. Zróbmy zmianę, która spowoduje, że sprawdzanie długości tekstu, nie będzie wymagało zmian w kodzie i rekompilacji projektu.
Ćwiczenie 2. Zmodyfikuj kod projektu w taki sposób, aby tekst był wczytywany z klawiatury.
Kod odpowiedzialny za wyświetlenie długości tekstu wyglądał w następujący sposób:
System.out.println("Dzisiaj jest piękny dzień.".length());
Wczytajmy ten tekst z klawiatury i przechowajmy w zmiennej. Wykorzystamy do tego metodę nextLine(), która sczytuje całą linię. Metoda next() sczytywała tylko jedno słowo.
Dodatkowo musimy, zabezpieczyć się przed sczytaniem nowej linii z poprzedniego zapytania, wstawimy zatem dodatkowe scanner.nextLine();
System.out.print("Wprowadź tekst: "); String tekst = scanner.nextLine(); // obliczenie długości tekstu i przypisanie do zmiennej int dlugoscTekstu = tekst.length(); // wyświetlenie informacji o długości System.out.println("Podany tekst ma długość: "+dlugoscTekstu);
Cały program wygląda tak:
import java.util.Scanner; class Program { public static void main (String args[]) { // deklaracja zmiennych String imie; int wiek; double pensja; // inicjalizacja zmiennych, poprzez wczytanie z klawiatury Scanner scanner = new Scanner(System.in); System.out.println("Podaj imię: "); imie = scanner.next(); System.out.println("Podaj wiek: "); wiek = scanner.nextInt(); System.out.println("Podaj pensję: "); pensja = scanner.nextDouble(); System.out.println("Imię "+imie); System.out.println("Wiek "+wiek); System.out.println("Pensja "+pensja); scanner.nextLine(); System.out.print("Wprowadź tekst: "); String tekst = scanner.nextLine(); // obliczenie długości tekstu i przypisanie do zmiennej int dlugoscTekstu = tekst.length(); // wyświetlenie informacji o długości System.out.println("Podany tekst ma długość: "+dlugoscTekstu); } }

Do ponownego uruchomienia programu wystarczy wywoływać komendę java Program.
Tym sposobem poznaliśmy zmienne, typy oraz klasę Scanner. A teraz zadanie dla Ciebie.
Zadanie 1. Napisz program przyjmujący: nazwa samochodu, marka, cena, rok produkcji. Przechowaj dane w zmiennej. Wyświetl dane w następujacy sposób:
—— samochód ——————-
— nazwa: wartość
— marka: wartość
— cena: wartość
— rok produkcji: wartość
——————————————-
Jako wartość, rozumiemy daną wprowadzoną z klawiatury.
Powodzenia ! 😀
Daj znać w komentarzach jak Ci poszło 🙂
Pytanie: po co scanner.close();
czy to cokolwiek zmienia w działaniu programu
W tak prostym programie nie zauważysz różnic. Zamknięcie scannera, możemy potraktować jako “dobrą praktykę”, mówi ona o tym, że wszelkie strumienie, które otwieramy, powinniśmy zamykać, aby uniknąć wycieku pamięci. Pojawiły się tutaj dwa terminy, które mogą być niejasne: strumień i wyciek pamięci.
Pisząc “strumień”, mam na myśli strumień wejścia/wyjścia (I/O) (więcej tutaj). W naszym programie scanner korzysta ze strumienia wejścia (System.in – standardowe wejście).
Wyciek pamięci, to nic innego jak sytuacja, w której program rezerwuje pamięć dla obiektu, ale jej nie zwalnia (nie usuwa go z pamięci). Jeśli “wyciek” byłby duży, to mogłoby dojść do zużycia dostępnej pamięci i wyrzucenie wyjątku OutOfMemoryError (więcej tutaj).