Obsługa klawiatury – Scanner

W tej lekcji kursu zaznajomimy się z klasą Scanner, która umożliwia nam obsługę klawiaturę. Dzięki temu, możemy bez problemu wczytywać wartości do aplikacji lub odpowiednio reagować na konkretne wciśnięcie konkretnego klawisza.

Zacznijmy!

Rozpocznijmy standardowo od pustego projektu z klasą oraz metodą Main.

public class Main {

    public static void main(String[] args) {
  
    }
}

Do obsługi klawiatury potrzebujemy wykorzystać jakąś bibliotekę – w naszym przypadku padło na klasę Scanner. Stwórzmy jej obiekt przy użycia operatora new w metodzie main.

Scanner scanner = new Scanner(System.in);

Na razie nie musisz wiedzieć czym jest obiekt – wystarczy Ci wiedzieć, że stworzyliśmy sobie właśnie jeden egzemplarz obiektu typu Scanner, który umożliwia nam m.in. odczyt wciśniętych klawiszy na klawiaturze.

Możliwe, że teraz w Intellij Idea Scanner został podświetlony na czerwono – oznacza to, że coś jest nie tak. W tym przypadku po prostu IDE nie wie skąd ma wziąć ten scanner – dlatego musimy mu to wskazać.

Importowanie

Przed nami pierwsze importowanie klasy, z której skorzystamy. Możemy to zrobić w prostszy sposób.

Najechać kursorem na wyraz Scanner, naciśnać Alt + Enter oraz wybrać opcję Import class (zaimportuj klasę) z pakietu java.util. Po tej operacji powinna pokazać Ci się w górnej cześci pliku następującka linia kodu:

import java.util.Scanner;

Oczywiście możemy tę linię kodu napisać ręcznie – nic nie stoi na przeszkodzie.

Importowanie – czyli załączanie innych klas – służy do tego, aby kompilator wiedział o jaki Scanner nam chodzi i skąd ma brać wszystkie potrzebne informację. Na tą chwilę tyle wystarczy, idźmy dalej – użyjmy scannera.

Pierwsze wczytanie

Abyśmy mogli coś wczytać z klawiatury potrzebujemy na początku zmiennej, gdzie będziemy mogli zapisać wczytane dane np. liczbę.

Po ostatniej lekcji powinieneś już potrafić deklarować zmienne, jeżeli nie to wróć do poprzedniej lekcji!

Zadeklarujmy na początek dwie zmienne, pierwsza typu int, druga typu float.

int firstValue;
float secondValue;

Czas na wczytywanie wartości – do tego celu użyjemy metod nextInt oraz nextFloat – jak nazwy wskazują, pierwsza służy do wczytywania liczb całkowitych, kolejna do liczb zmiennoprzecinkowych.

System.out.println("Podaj liczbe calkowita: ");
firstValue = scanner.nextInt();

I jeszcze druga liczba:

System.out.println("Podaj liczbe zmiennoprzecinkowa: ");
secondValue = scanner.nextFloat();

Wypiszmy sobie jeszcze na ekran wczytane liczby przy użyciu System.out.println

System.out.println("Pierwsza liczba to: "+firstValue);
System.out.println("Druga liczba to: "+secondValue);

Ostatecznie nasz program powinien wyglądać tak:

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int firstValue;
        float secondValue;

        System.out.println("Podaj liczbe calkowita: ");
        firstValue = scanner.nextInt();

        System.out.println("Podaj liczbe zmiennoprzecinkowa: ");
        secondValue = scanner.nextFloat();

        System.out.println("Pierwsza liczba to: "+firstValue);
        System.out.println("Druga liczba to: "+secondValue);
    }
}

Czas na kompilację i uruchomienie naszego programu, klikamy Shift + F10 i testujemy nasz krótki program.

Po uruchomieniu programu wg instrukcji podajemy liczby – pierwsza całkowita, druga zmiennoprzecinkowa (przy użyciu przecinka, a nie kropki).

Po podaniu poprawnych danych powinnyśmy otrzymać taki rezultat:

Pierwsza liczba to: 5
Druga liczba to: 4.3

Wczytywanie tekstu

Skoro wczytaliśmy już pierwsze liczby to czas na wczytywanie tekstu, może będzie to bardziej emocjonujące przeżycie. 😉

Do przetrzymywania ciągu znaków użyjemy Stringa – jest to tak naprawdę tablica (zbiór) wielu charów – typ prymitywny char został obudowany klasą String, aby można było łatwiej operować na ciągach znaków.

Na razie klasę Scanner i String możesz traktować jako pudełko, które dostarcza nam gotowych funkcjonalności, z których możemy korzystać – nie musimy na razie wchodzi w szczegóły tych pudełek. 😉

Rozpocznijmy od pustego projektu – jednak w tym przypadku już z obiektem typu Scanner.

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
    }
}

Czas na stworzenie zmiennej – tym razem typu String, aby móc zapisać wczytane słowo.

String inputText;

Teraz możemy wczytać słowo z klawiatury przy użyciu funkcji next() – która zwraca ciąg znaków – mogą to być znaki specjalne jak i cyfry.

inputText = scanner.next();

Jednak może kojarzysz zasadę z poprzedniej lekcji: “zmienne należy deklarować jak najpóźniej jak to jest możliwe” – dlatego, możemy to zapisać w jednej linii.

String inputText = scanner.next();

A przed wczytaniem użytkownikowi jeszcze dać informację:

System.out.println("Podaj słowo: ");

Na koniec wyświetlmy wczytane słowo.

System.out.println("Podałeś: "+inputText);

I cały nasz kod wygląda tak:

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.println("Podaj słowo: ");
        String inputText = scanner.next();

        System.out.println("Podałeś: "+inputText);
    }
}

Czas na testowanie, skompilujmy i odpalmy program przy użyciu SHIFT + F10 oraz podajmy jakieś słowo.

Podałeś: kurs-java

Jak widać program działa poprawnie.

Spróbujmy teraz podać coś dłuższego, np. zdanie: “Kurs java na 1024kb.pl” i po uruchomieniu programu otrzymujemy taki efekt:

Podałeś: Kurs

Jak widać nie wczytano całego zdania – co jest problemem?

Wczytywanie zdania

Funkcja (metoda) next() wczytując znaki z klawiatury robi to aż do napotkania białych znaków tzn. spacje, tabulatory, new line itd. – aby móc wczytać zdanie ze znakami białymi trzeba skorzystać z funkcji nextLine().

Aby nasz program działał poprawnie wystarczy zmienić jedną linię kodu z:

String inputText = scanner.next();

na

String inputText = scanner.nextLine();

I teraz podając zdanie “Kurs java na 1024kb.pl” otrzymujemy taki o to rezultat:

Podałeś: Kurs java na 1024kb.pl

Czyli wszystko działa poprawnie!

Podsumowanie

W tej choć trochę długiej lekcji mam nadzieję, że wytłumaczyłem Ci wszystkie zagadnienia związane z wczytywanie liczb oraz tekstu z klawiatury do naszej aplikacji przy użyciu klasy Scanner.

Dodatkowo poznałeś typ String, który służy do przechowywanie ciągów znakowych, a można go również inicjalizować przy użyciu podwójnych apostrofów.

String name = "Kamil";

Po lekcji czas na rozwiązanie krótkich zadań w celu sprawdzenia swojej wiedzy.

  1. Wczytaj od użytkownika tekst, a następnie wyświetl go na ekran konsoli.
  2. Wczytaj od użytkownika imię, nazwisko, wiek, wzrost oraz wagę, a następnie wyświetl na ekran konsoli napis: “Nazywasz się {imię} {nazwisko}, masz {wiek} lat, masz {wzrost} cm wzrostu oraz ważysz {waga} kg”.
  3. Wczytaj dwie liczby całkowite od użytkownika, a następnie wyświetl wynik dodawania i odejmowania przy użyciu operatorów – np. wynik = liczbaA + liczbaB, wynik = liczbaA – liczbaB.

Rzwiązania zadań możesz znaleźć tutaj.

Więcej o operatorach matematycznych opowiem w następnej lekcji kursu, jeżeli jesteś w stanie to już teraz wykonaj drugie zadanie.

Pamiętaj, aby nazwy zmiennych zapisywać w języku angielskim – od samego początku wyrabiaj w sobie dobre nawyki!

Kamil Klimek

Od 2016 jestem programistą Java. Przez pierwsze 4 lata pracowałem jako Full Stack Java Developer. Później postanowiłem postawić nacisk na Javę, żeby jeszcze lepiej ją poznać.

Subscribe
Powiadom o
guest
8 komentarzy
najstarszy
najnowszy oceniany
Inline Feedbacks
View all comments
Newo
Newo
5 lat temu

Po uruchomieniu programu:

import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int firstValue;
float secondValue;
System.out.println(“Podaj liczbe calkowita: “);
firstValue = scanner.nextInt();
System.out.println(“Podaj liczbe zmiennoprzecinkowa: “);
secondValue = scanner.nextFloat();
System.out.println(“Pierwsza liczba to: “+firstValue);
System.out.println(“Druga liczba to: “+secondValue);
}
}

Wyskakuje błąd:

Exception in thread “main” java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:864)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextFloat(Scanner.java:2345)
at Main.main(Main.java:10)

Process finished with exit code 1

Kamil Klimek
Kamil Klimek
5 lat temu
Reply to  Newo

Wyjątek InputMismatchException został rzucony, ponieważ prawdopodobnie wprowadzasz źle wartość. Podczas wprowadzania liczby zmiennoprzecinkowej spróbuj podać liczbę z przecinkiem lub kropką – jedno z tych rozwiązań powinno przejść.

Newo
Newo
5 lat temu
Reply to  Kamil Klimek

Ok dzięki za pomoc wystarczyło dać przecinek zamiast kropki przy zmiennoprzecinkowej 🙂

Zap
Zap
5 lat temu

Wykonałem pierwsze zadanie. Dla pewności chodziło o to by zaokrąglić wyniki do jednego miejsca po przecinku, jeżeli ktoś poda wynik bardziej dokładny ? Nie wiem tylko czy da się to zrobić bardziej elegancko. To moje rozwiązanie
https://github.com/JaKoTaKo314/Scanner/blob/master/src/org/lauchcode/Main.java

Newo
Newo
5 lat temu
Reply to  Zap
Zap
Zap
5 lat temu
Reply to  Newo

Przejeżdżałem twój kod i stwierdziłem że niepotrzebnie użyłem doble wystarczyło float (w moim kodzie). Ja trochę przekombinowałem (dodałem funkcję zaokrąglenia). Natomiast w Twoim kodzie nie da się podać wzrostu z dokładnością do jednego miejsca po przecinku użyłeś funkcji “int firstValue;” która zapisuje tylko liczby całkowite.

Ula Ł
Ula Ł
5 lat temu

Wykonałam zadanie z treści lekcji w jednej klasie w tym samym pakiecie zamiast w różnych pakietach. W konsoli wpisuję kolejno: integera, floata, Stringa (pojedynczy wyraz z użyciem funkcji next()), Stringa (zdanie z użyciem funkcji nextLine()). Nie mogę dać entera po pierwszym Stringu. Po wciśnięciu entera program kończy działanie a w miejsu gdzie powinno być zdanie wstawia puste miejsce. Jeśli zamiast entera dam spację wtedy obie wartości (wyraz i zdanie) są printowane. Dlaczego?

Ula Ł
Ula Ł
5 lat temu
Reply to  Ula Ł

Z pomocą internetu chyba sama zrozumiałam jak to działa. Po wykonaniu funkcji next() nie przeskakujemy do nowej linii, zostajemy w tej w której aktualnie jesteśmy. Z kolei Enter jest rozpoznawany przez funkcję nextLine() jako “koniec instrukcji, przejdź do nowej linii” dlatego działanie programu skończyło się na Enterze bo on został wczytany przez tą funkcję jako pierwszy i program nie dotarł już do mojego zdania

8
0
Would love your thoughts, please comment.x