Java Tutorial #24

Konsolen Input mit der Scanner Klasse

2019-08-05 | credits: Siarhei/ adobe.stock

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. 

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 inputreferenziert. 
  • 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):

DESCRIPTION

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

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

DESCRIPTION

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:

DESCRIPTION

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();
...
Werbung

Java lernen

Werde zum Java Profi!

PHP Lernen

Lerne serverbasierte Programmierung

JavaScript lernen

Skille dein Webcoding

FALCONBYTE.NET

Handmade with 🖤️

© 2018-2023 Stefan E. Heller

Impressum | Datenschutz | Changelog

Falconbyte Youtube Falconbyte GitHub facebook programmieren lernen twitter programmieren lernen discord programmieren lernen