Falconbyte unterstüzen
Betrieb und Pflege von Falconbyte brauchen viel Zeit und Geld. Um dir auch weiterhin hochwertigen Content anbieten zu können, kannst du uns sehr gerne mit einem kleinen "Trinkgeld" unterstützen.
Schnelles Code Beispiel
Scanner scanner = new Scanner(System.in);
System.out.println("Gib einen Text ein: ");
String input1 = scanner.nextLine();
System.out.println("Gib einen Integer-Wert ein: ");
int input2 = scanner.nextInt();
System.out.println("Deine Eingaben: " + input1 + ", " + input2);
- Wie Scanner funktioniert
- Die next-Methoden
- Mehrere Eingaben nacheinander
- Übungen
Inhaltsverzeichnis
Wie Scanner funktioniert
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);
- Wir erzeugen zunächst ein neues Scanner-Objekt. Dem Konstruktor übergeben wir den Wert System.in, was bewirkt, dass der Scanner die Benutzereingaben von der Tastatur liest.
- Anschließend folgt eine normale System.out.println()-Anweisung, die den Benutzer auffordert, einen Text einzugeben. Das ist natürlich keine Pflicht-Zeile.
- Nun folgt die Methode nextLine() auf der Scanner-Referenz. Mit dieser Methode wird die Eingabe eingelesen, nachdem der Benutzer die Taste ENTER gedrückt hat. Der zurückgelieferte Wert wird dann mit der String-Variablen input referenziert.
- Am Ende nochmal System.out.println(), um das Programm zu testen.
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):
Die next-Methoden
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
InputMismatchException bei double-Eingaben
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 InputMismatchException entgegengeworfen 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:
- An instance of this class is capable of scanning numbers in the standard formats as well as in the formats of the scanner's locale. A scanner's initial locale is the value returned by the Locale.getDefault(Locale.Category.FORMAT) method.
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.
Mehrere Eingaben nacheinander
Es sind natürlich auch mehrere Tastatur-Eingaben in die Konsole nacheinander mö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:
Problem: nextInt(), nextdouble() vor nextLine()
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
- Wir können dieses Problem lösen, indem wir einfach einmal zusätzlich die nextLine() Methode nach nextInt() oder nextDouble() hinzufügen:
...
int inputInt = scanner.nextInt();
scanner.nextLine(); // verarbeitet das "\n"
String inputString = scanner.nextLine();
...
Übungen
einfach
Frag den Benutzer in der Konsole nach seinem Namen. Der eingegebene String soll anschließend folgendermaßen ausgegeben werden:
Hallo Mr. Bailey, schön Dich kennenzulernen.
mittel
Fragen wir den Benutzer anschließend nach seinem Alter. Wenn die Eingabe kleiner als 18 ist, soll entsprechend der Eingabe einer der beiden Texte erscheinen:
Alter kleiner 18: Leider kein Zutritt.
Alter 18 oder höher: Willkommen!
schwer
Jetzt setzen wir mal die Ansätze für ein primitives Text-Adventure. Wenn der Benutzer 18 oder älter ist, wird er gefragt, in welche Tür er eintreten möchte. Wir können ihn so fragen:
Du stehst allein vor vier Türen, hinter denen schreckliche Gefahren lauern. Nur eine Tür sichert dein Überleben. In welche Tür möchtest du eintragen?
Tür 1: Mehrere Kanonen werden auf dich schießen.
Tür 2: Ein großes Feuer wird dir entgegenschlagen.
Tür 3: Ein Löwe, der seit 6 Wochen nichts mehr zum Fressen bekommen hat.
Tür 4: Hinter dieser Tür ist keine Luft zum Atmen. Du hast keine Sauerstoffmaske o.ä.
In welche Tür möchtest Du eintreten? Gib die Tür-Nummer (1, 2, 3 oder 4) ein: