Die Klasse Scanner aus dem Paket java.util ermöglicht es uns, Benutzer-Eingaben über die Java-Konsole aufzunehmen. Damit werden unsere Programme erstmals auf sehr rudimentäre Art interaktiv.
Die Klasse Scanner befindet sich im Java Paket java.util der Standardbibliothek und muss daher importiert werden:
import java.util.Scanner;
Benutzereingaben über die Konsole einzulesen, funktioniert dann recht einfach. Hier ein Beispiel:
Scanner scanner = new Scanner(System.in);
System.out.println("Geben Sie einen Text ein und drücken Sie ENTER:");
String input = scanner.nextLine();
System.out.println("\n" + "Ihr Text: " + input);
Das Programm hält bei der nextLine()-Methode an und wird erst fortgesetzt, wenn der Konsolen-Input mit der Taste ENTER bestätigt wurde.
Das Ergebnis sieht in der Java-Konsole von intelliJ dann so aus (Tastatur-Eingaben in grün):
Wir haben in unserem Beispiel oben die Methode nextLine() für String-Eingaben bereits kennengelernt.
Sollen dagegen int oder double-Werte in die Konsole eingegeben werden, benutzen wir dafür andere next-Methoden.
nextInt() für die Eingabe von Ganzzahlen (int):
Scanner scanner = new Scanner(System.in);
System.out.println("Geben Sie eine ganze Zahl ein und drücken Sie ENTER:");
int inputInt = scanner.nextInt(); // int-Wert eingeben
nextDouble() für die Eingabe von Fließkommawerten (double):
Scanner scanner = new Scanner(System.in);
System.out.println("Geben Sie eine Zahl ein und drücken Sie ENTER:");
double inputDouble = scanner.nextDouble(); // double-Wert eingeben
Wenn wir aber einen double-Wert wie gewohnt mit einem Punkt in die Konsole eintippen (z.b. 1.2), kann es sein, dass wir eine InputMismatchExceptionentgegengeworfen bekommen:
Exception in thread "main" java.util.InputMismatchException at java.util.Scanner.throwFor(Scanner.java...
Tippen wir stattdessen - gegen unsere Gewohnheit - den double-Wert statt mit einem Punkt mit einem Komma ein (z.B. 1,2), funktioniert das Programm auf einmal. Warum ist das so?
Die Java-Dokumentation gibt uns eine Erklärung:
Das heißt: Sitzen wir vor einem System mit deutscher Spracheinstellung (de_DE), müssen wir bei nextDouble() eine Fließkomma-Eingabe mit einem Komma in die Konsole eingeben und nicht mit einem Punkt wie im Anglo-Amerikanischen.
Es sind natürlich auch mehrere Tastatur-Eingaben in die Konsole nacheinandermöglich:
// Erste Eingabe
System.out.println("Geben Sie einen String ein:");
String inputString = scanner.nextLine();
// Zweite Eingabe
System.out.println("Geben Sie einen int-Wert ein:");
int inputInt = scanner.nextInt();
// Dritte Eingabe
System.out.println("Geben Sie nun einen double-Wert ein:");
double inputDouble = scanner.nextDouble();
System.out.println("\n" +"Ihre Eingaben lauten:");
System.out.println(inputString + ", " + inputInt + ", " + inputDouble);
Bei diesem Code sieht die Konsole nach erfolgter Benutzereingabe (in grün) so aus:
In unserem Beispiel läuft alles korrekt. Wenn wir aber die Methoden nextInt() oder nextDouble() vor nextLine() schreiben, sieht es so aus, als würde nextLine() übersprungen/ nicht ausgeführt werden:
System.out.println("Geben Sie einen int-Wert ein:");
int inputInt = scanner.nextInt();
System.out.println("Geben Sie einen String ein:");
String inputString = scanner.nextLine();
System.out.println("\n" +"Ihre Eingaben lauten:");
System.out.println(inputInt + ", " + inputString);
Wir erhalten so nach der Eingabe des int-Werts (grün) keine Gelegenheit, den String einzugeben:
Der Grund ist folgender: Wenn wir ENTER drücken, entspricht das einer neuen Zeile \n.
nextInt() und nextDouble() aber lesen nur den int- bzw. double-Wert ein und nicht die neue Zeile \n.
Dagegen liest nextLine() den String und die durch ENTER erzeugte neue Zeile \n ein.
Geben wir nun also einen int-Wert (200) ein und drücken anschließend die ENTER-Taste, haben wir einen int-Wert (200) und einen leeren String:
System.out.println(inputString.isEmpty()); // true
...
int inputInt = scanner.nextInt();
scanner.nextLine(); // verarbeitet das "\n"
String inputString = scanner.nextLine();
...
Java Basics
[Java einrichten] [Variablen] [Primitive Datentypen] [Operatoren] [if else] [switch-case] [Arrays] [Schleifen]
Objektorientierung
[Einstieg] [Variablen ] [Konstruktor] [Methoden] [Rekursion] [Statische Member] [Initializer] [Pass-by-value] [Objektsammlungen] [Objektinteraktion] [Objekte löschen]
Klassenbibliothek
[Allgemeines] [String ] [Math] [Wrapper] [Scanner] [java.util.Arrays] [Date-Time-API]
Vererbung
[Einstieg Vererbung] [Konstruktoren bei Vererbung ] [Der protected Zugriffsmodifikator] [Abstrakte Klassen und Methoden] [Polymorphie in Java] [Typumwandlung] [Die Klasse Object] [Die toString()-Methode] [Objekte vergleichen] [Was ist ein Interface?]