1. Odczyt z konsoli, System.in
W poprzednich lekcjach poznaliśmy polecenia wyprowadzania na ekran. Do tego używaliśmy obiektu System.out i jego method print() oraz println(). Proste i wygodne.
Ale, jak się zapewne domyślacie, sam wyjściowy wydruk na ekran to za mało. Celem większości programów jest zrobienie czegoś pożytecznego dla użytkownika. Dlatego bardzo często trzeba, aby użytkownik mógł wprowadzać dane z klawiatury.
Podobnie jak do wyjścia, do wprowadzania danych również istnieje specjalny obiekt — System.in. Niestety nie jest on tak wygodny, jak byśmy chcieli. Ten obiekt pozwala odczytywać dane z klawiatury, ale tylko po jednym znaku naraz.
Dlatego skorzystamy z jeszcze jednej klasy, która w parze z obiektem System.in da nam wszystko, czego potrzebujemy. W Javie od dawna są klasy na każdą okazję. I z jedną z nich zaraz się zapoznamy.
2. Klasa Scanner
Klasa Scanner (pełna nazwa java.util.Scanner) potrafi odczytywać dane z różnych źródeł: konsoli, plików, Internetu. Jeśli chcemy, aby odczytywała dane z klawiatury, musimy przekazać jej obiekt System.in jako parametr — źródło danych. A obiekt typu Scanner sam już się zorientuje, co z tym zrobić.
Odczyt z klawiatury za pomocą obiektu typu Scanner będzie wyglądał mniej więcej tak:
| Kod | Objaśnienie |
|---|---|
|
Tworzymy obiekt klasy Scanner. Czytamy z klawiatury wiersz tekstu. Czytamy z klawiatury liczbę. |
Wygląda na nieskomplikowane, ale czy naprawdę wszystko jest takie proste?
Myślę, że macie mnóstwo pytań i zaraz na nie odpowiemy.
Ale najpierw zaprezentujemy przykład pełnego programu, w którym używana jest klasa Scanner:
void main()
{
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. Tworzenie obiektu Scanner
Pierwsze pytanie — co to za wiersz Scanner console = new Scanner(System.in);?
Taki wiersz może być mylący, jednak będziecie go często spotykać. Myślę więc, że nadszedł czas wyjaśnić, co tu jest napisane.
Przypomnijmy, jak zwykle tworzymy zmienną tekstową:
String str = "tekst";
Najpierw zapisujemy typ zmiennej (String), potem jej nazwę (str) i wreszcie, po znaku równości, zapisujemy wartość.
W naszym dziwnym wierszu w rzeczywistości jest dokładnie to samo:
Scanner console = new Scanner(System.in);
Wszystko, co znajduje się po lewej stronie znaku równości, to deklaracja zmiennej typu Scanner o nazwie console. Można ją było nazwać na przykład s albo scanner, a nawet keyboard. Wtedy kod wyglądałby tak:
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();
Myślę, że teraz wszystko stało się dużo jaśniejsze.
A kod, który znajduje się po prawej stronie znaku równości, jest nieco bardziej złożony. Mam na myśli new Scanner(System.in); Ale i tu nie ma nic kosmicznego.
W tym kodzie mówimy maszynie wirtualnej Java: utwórz nowy obiekt (słowo new) typu Scanner i przekaż mu jako parametr to, z czego nowo utworzony obiekt Scanner będzie pobierał dane — obiekt System.in.
Po wykonaniu całego tego wiersza będziemy mieli zmienną o nazwie console typu Scanner, za pomocą której nasz program będzie mógł odczytywać dane z klawiatury.
4. Wywoływanie method
W powyższym przykładzie nasza zmienna console typu Scanner przechowywała w sobie referencję do obiektu typu Scanner.
Aby wywołać methody obiektu, na który wskazuje zmienna, należy po nazwie zmiennej napisać kropkę, a następnie nazwę methody i parametry. Ogólny zapis tego polecenia jest taki:
variable.method(parametry);
Przykłady:
System.out.println("Cześć");
System.out.println(1);
Jeśli nie planujesz przekazywać do funkcji parametrów, należy napisać po prostu puste nawiasy:
variable.method();
Przykład:
System.out.println();
5. Wprowadzanie danych z konsoli
Wprowadzać dane z klawiatury, gdy mamy obiekt typu Scanner, jest bardzo łatwo.
Aby odczytać z klawiatury wiersz (łańcuch), użyj polecenia:
String str = console.nextLine();
Gdy program dojdzie do wykonania tego wiersza, zatrzyma się i będzie czekał, aż użytkownik wprowadzi dane i naciśnie klawisz Enter. Następnie wszystko, co wprowadził użytkownik, zostanie zapisane w zmiennej str.
Aby odczytać z klawiatury liczbę całkowitą, użyj polecenia:
int number = console.nextInt();
Tu wszystko działa analogicznie do poprzedniego polecenia. Gdy program dojdzie do wykonania tego wiersza, zatrzyma się i będzie czekał, aż użytkownik wprowadzi dane i naciśnie klawisz Enter. Następnie wszystko, co wprowadził użytkownik, zostanie przekształcone na liczbę i zapisane w zmiennej number.
Jeśli użytkownik wprowadzi dane, których nie można przekształcić na liczbę całkowitą, w programie wystąpi błąd i zakończy on działanie.
Aby odczytać z klawiatury liczbę zmiennoprzecinkową, użyj polecenia:
double number = console.nextDouble();
Polecenie to działa w pełni analogicznie do nextInt(), tylko sprawdza, czy wprowadzone dane można przekształcić na liczbę typu double.
Przykład programu, który odczytuje z klawiatury dwie liczby i wyświetla ich sumę:
void main()
{
Scanner console = new Scanner(System.in);
int a = console.nextInt();
int b = console.nextInt();
System.out.println(a + b);
}
Uwaga
Użytkownik może wprowadzić kilka liczb w jednym wierszu, oddzielając je spacjami: taka sytuacja zostanie poprawnie obsłużona przez methody klasy Scanner. Jednak liczby zostaną odczytane przez program dopiero po naciśnięciu klawisza Enter.
GO TO FULL VERSION