Jetzt anmelden...

Login
Passwort
Registrieren

Java Tutorial #23

Konsolen Input mit der Scanner Klasse

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. Dem ersten Textadventure steht so nichts mehr im Weg.

Kommentare [0]

Stefan 11.08.2019

Infos zum Artikel

Kategorie Java
Autor Stefan
Datum 11.08.2019

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 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):

Java Konsole Input Scanner

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:

Java Konsole Input Scanner

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:

Java Konsole Input Scanner

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.

Lösung ein-/ausblenden

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!

Lösung ein-/ausblenden

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:

Lösung ein-/ausblenden

Kommentar schreiben

Nur angemeldete und aktivierte Benutzer können kommentieren.

Alle Kommentare

Es gibt bislang noch keine Kommentare zu diesem Thema.

Pass-by-value in Java

wie genau der Vorgang der Parameterübergabe bei Methoden abläuft, klären wir hier.

Primitive Datentypen

Am Ende des Kapitels werden Sie wissen, wie Primitive Datentypen korrekt eingesetzt werden.

Konstruktoren bei Vererbung

Trainieren Sie ihre Konstruktoren-Skills

FALCONBYTE.NET

Handmade with 🖤️

© 2018, 2019 Stefan E. Heller

Impressum | Datenschutz

facebook programmieren lernen twitter programmieren lernen youtube programmieren lernen