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.

Objekte vergleichen

Was ist der Unterschied zwischen == und equals()?

Objekte löschen

Wir wissen, wie wir Objekte erstellen können. Aber wie werden wir sie wieder los?

Objektinteraktion

Wie interagieren Objekte in einem Programm miteinander?

FALCONBYTE.NET

Handmade with 🖤️

© 2018, 2019 Stefan E. Heller

Impressum | Datenschutz

facebook programmieren lernen twitter programmieren lernen youtube programmieren lernen