Lerne Coding
Java: Terminal Eingaben einlesen mit der Scanner Klasse!
31.07.2022

Mit der Scanner Klasse eine Konsolen Eingabe lesen

Inhaltsverzeichnis
[[TABLE OF CONTENTS]]
access_timeGeschätzte Lesezeit ca. Minuten

In diesem Artikel zu der Programmiersprache Java wollen wir uns die Scanner Klasse anschauen, um ins Detail zu gehen, die Methoden um Nutzereingaben aus der Konsole (Kommandozeile, CLI) entgegenzunehmen. Diese ist für kleinere Tools oder zum Beispiel ein Text Adventure Spiel interessant. Und ist zu Anfang, wenn man in die Java Programmierung einsteigt, eine wichtige Klasse, die man kennen sollte, um kleine Interaktivitäten zu erzeugen. Die Java Scanner Klasse findest du im java.util Paket seit der Java Version 5.0 (1.5) erschienen am 30. September 2004.

Später können zum Beispiel auch Rest APIs oder UIs verwendet werden, um Nutzereingaben entgegenzunehmen, am Anfang solltest du dich allerdings auf einfache Methoden verlassen, anstatt in die Komplexität von JavaFX oder Spring abzutauchen.

Scanner scanner = new Scanner(System.in);

System.out.println("Wie ist dein wunderbarer Name?");

if(scanner.hasNextLine()) {
    String name = scanner.nextLine();

    System.out.println("Dein Name ist " +  name + ", schöner Name!");
}

In diesem ersten Beispiel zeige ich ein erstes kleines Programm, das den Namen einer Person abfragt, und diesen mit 2 anderen String verknüpfen wird. Das Verknüpfen von 2 Strings ist eine Operation, die Programmierer als Konkatenation bezeichnen. Wie das Lesen und Auswerten einer Konsolen-Eingabe im Detail funktioniert, schauen wir uns nun an!

Eine Konsolen-Eingabe einlesen in Java

Die einfachste Möglichkeit um mit der Konsole von Java zu interagieren ist die Scanner Klasse aus dem Paket java.util aus der Standardbibliothek, beginnen wir damit diese zu importieren (Zeile 1). Anschließende können wir den Scanner Konstruktor aufrufen, diesem übergeben wir System.in als Parameter. Hier könntest du auch eine Datei übergeben, die dann geparst werden kann. Nun haben wir eine Variable scanner⁣, die ein Scanner Objekt enthält (Zeile 8). Dieses stellt verschiedene Methoden bereit um Inputs zu lesen, von verschieden Datentypen und auch zu prüfen, ob spezifische Typen in der Konsolen Eingabe existieren.

import java.util.Scanner;

public class Main{

    public static void main (String[] args){
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
    }

}

Mit der Methode .nextLine() kann die nächste Zeile, die eingegeben wird, gelesen werden, mittels RETURN / ENTER bestätigt der Nutzer seine Eingabe. Diese Methode eignet sich für die Eingabe von Zeichenketten (Strings). Damit lassen sich verschiedenste Anwendungen realisieren. Eine Anwendung könnte sein, dass sich Nutzer über die Kommandozeile ein Auto konfigurieren. Sie geben ein, wie viele Türen, PS oder Farbe das Auto hat. Diese Angaben kannst du auslesen und einem selbst programmierten Auto-Objekt hinzufügen.

Die Variable name bei diesem Beispiel beinhaltet nun den String den der Nutzer übergeben hat, mit dieser Variable kann nun wie mit jeder anderen Variable weiterverfahren werden (Zeile 9).

Eine Zahl (Integer) einlesen

Mittels der Scanner Klasse kannst du nicht nur die nächste Zeile einlesen, sondern auch spezifische Daten-Typen, zum Beispiel die nächste Zahl. Diese unterscheidet sich nicht sonderlich zu der vorherigen Methode. So können wir zum Beispiel das Alter einer Person abfragen. Um das ganze für den Nutzer noch interaktiver zu gestalten, kannst du zum Beispiel auch noch ein Print Statement mit einem Hinweis auf die Eingabe hinterlegen.

Scanner scanner = new Scanner(System.in);

System.out.println("Bitte geben Sie ihr Alter ein:");
int age = scanner.nextInt();

Anschließend kannst du mit dem Integer/Ganzzahl weiter arbeiten. Zum Beispiel, um das Alter in einer if-Abfrage oder in einem Switch Case auszuwerten.

Weitere Zahlentypen wie Byte und Long können ebenfalls verwendet werden, bis auf die Größe des Speichers und Typs verhalten sich die Methoden auch so, wie oben beschrieben. Heißt für Byte ist es nextByte und bei Long ist es ebenfalls nextLong.

Eine Fließkommazahl (Double, Float) einlesen

Für Fließkommazahlen kannst du in Java den double und float Datentyp verwenden. Je nach Datentyp gibt es eigene Methoden, um diese über die Konsole einzulesen. Um einen Typ Float bei der Eingabe zu lesen, kann nextFloat() verwendet werden. Für die Eingabe von Dobules kannst du nextDouble verwenden!

Scanner scanner = new Scanner(System.in);

System.out.println("Bitte geben Sie ihre Größe in Metern (Float) ein:");
float height_float = scanner.nextFloat();

System.out.println("Bitte geben Sie ihre Größe in Metern (Double) ein:");
double height_double = scanner.nextDouble();

Tipp bei InputMismatchException - Komma, Punkt falsch eingeben!

Es kann bei deiner Eingabe vorkommen, dass du eine InputMismatchException erhältst, zum Beispiel wenn du 5.5 eingibst. Diese Exception kommt daher, da die lokale Konvention bei der Terminaleingabe verwendet wird. Falls du dein System auf Deutsch eingestellt hast, wird in der Eingabe auch ein Komma erwartet und nicht die übliche Eingabe wie in Programmiersprachen mittels Punkt. Mittels System.out.println(Locale.getDefault()); kannst du dir deinen aktuellen Einstellungen ausgeben lassen. Falls du in deiner Software die typische englische Eingabe willst, wie du es auch von Programmiersprachen gewöhnt bist, kannst, du scanner.useLocale(Locale.ENGLISH); Eingeben in deinem Programm. scanner ist deine Variable mit der Instanz der Scanner Klasse.

Exception in thread "main" java.util.InputMismatchException
    at java.base/java.util.Scanner.throwFor(Scanner.java:939)
    at java.base/java.util.Scanner.next(Scanner.java:1594)
    at java.base/java.util.Scanner.nextDouble(Scanner.java:2564)
    at Application.main(Application.java:23)

Einen Wahrheitswert (Boolean) einlesen

Neben Zahlen und Zeichen können auch Boolean oder zu Deutsch Wahrheitswerte eingelesen werden. Dafür existiert die Methode nextBoolean diese kann genau 2 Werte auslesen true oder false. Das ist zum Beispiel für Abfragen in deinem ersten kleinen Kommandozeilenprogramm interessant. Im Nachfolgenden Stellen wir dem Nutzer eine Frage lesen den Boolean aus. Und geben ihm dann noch einen kleinen Hinweis aus.

System.out.println("Kennst du das „Paradoxon des Epimenides“ ? ");
boolean knowen = scanner.nextBoolean();

if(knowen) {
    System.out.println("Sehr schön!");
} else {
    System.out.println("„Alle Kreter sind Lügner“, sagt ein Kreter");
}

Fehler vermeiden, Eingaben prüfen!

Nun ist dir bestimmt schon aufgefallen, dass du bei einer Integer-Eingabe oder bei einer Boolean Eingabe etwas anders eingibst als erwartet, zum Beispiel Buchstaben. Erhältst du eine Exception, und zwar die InputMismatchException. Um diese abzufangen hat jede next Methode noch eine hasNext* Methode bei Boolean ist es dann hasNextBoolean()

Unser Programm von der Verwendung des nextBoolean würde nun wie folgt aussehen:

System.out.println("Kennst du das „Paradoxon des Epimenides“ ? ");

if(scanner.hasNextBoolean()) {
    boolean knowen = scanner.nextBoolean();

    if(knowen) {
        System.out.println("Sehr schön!");
    } else {
        System.out.println("„Alle Kreter sind Lügner“, sagt ein Kreter");
    }
} else {
    System.out.println("Deine Eingabe war nicht Valide!");
}

Durch die Verwendung der If-Kontrollstruktur können wir nun Invalide Anfragen Handeln, alternative könntest du es zum Beispiel auch mit einer while Schleife in Kombination verwenden und die Frage so lange stellen bis der Nutzer ein Valides Ergebnis eingibt.

Vorsicht: nextLine nach next* lesen

Es gibt noch einen Sonderfall, den du kennen solltest, und zwar wenn du nextLine nach einem next<Typ> abrufst wirst du immer einen Lehren String erhalten, da die Typ spezifischen Methoden nur den Typ Wert lesen und das \\n „Nächste Zeile“-Zeichen stehen lassen. Damit dieser deiner nächsten String Eingabe nicht im Wege steht. Kannst du zum Beispiel nach jeder next<Typ> Abfrage ein nextLine() Abruf machen. So wurde das „Nächste Zeile“-Zeichen aufgelöst und es geht weiter in der Abfrage. Alternative als deutlich charmantere Variante kannst du nur mit nextLine() Arbeiten und ein Entsprechenden Wrapper für Integer, Doubles, Boolean Schreiben um diese Selbständig zu validieren und zu Casten.

Zum Beispiel wäre es ja auch schöner anstatt nextBoolean Angaben wie Ja, Ok, Yes, y, J annehmen zu können und diese in einen Boolean zu konvertieren.

Beispielprogramm: Der Trinkgeld-Rechner!

Als kleines Beispiel wollen wir einen kleinen Trinkgeld-Rechner Schreiben, gerne Versuch erst einmal eine eigene Lösung zu entwickeln und anschließende meine Erklärung und Ansatz dir anzuschauen. Der einfachheitshalber Arbeiten wir für das Beispiel nur in der Main Methode, also keine eigenen zusätzlichen Methoden und/oder Klassen.

Tipp: Das nachfolgende Beispiel arbeiten mit 2 while Schleifen diese sind bis auf kleinere Unterschiede identisch. Als zusätzliche Aufgabe kannst du Versuchen, diese in eine extra Methode auszulagern.

Erklärung als Erstes definieren wir uns 2 Variablen, eine für den Prozentwert und eine für den Geldwert. Beide Beträge sind zu Anfang Negative, damit die while Schleifen zutrifft. Sobald ein Prozentwert oder Geldwert abgefragt wurde, wird dieser Wert der Variable zugewiesen und das Programm läuft weiter durch. Um zu verhindern, dass negative Werte in unsere Rechnung gelangen, muss eben ein positiver Wert angegeben werden. Anschließende findet noch eine einfache Berechnung von Prozentwerten statt. Als Ausgabe gibt es die Höhe des Trinkgelds und die Ausgabe des Gesamtbetrages.

import java.util.Scanner;

public class Application {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        int percantage = -1;
        double money = -1;

        System.out.println("Wie viel Prozent an Trinkgeld möchtest du geben?");

        while(percantage < 0) {
            if(scanner.hasNextInt()) {
                percantage = scanner.nextInt();
            } else {
                System.out.println("Leider war deine Eingabe nicht richtig. Bitte gebe eine Zahl ein, ohne Nachkommastellen!");
                scanner.nextLine();
            }
        }

        System.out.println("Du sollst " + percantage + " % Trinkgeld geben");

        System.out.println("Wie hoch ist die zu bezahlende Rechnung?");

        while(money < 0) {
            if(scanner.hasNextDouble()) {
                money = scanner.nextDouble();
            } else {
                System.out.println("Leider war deine Eingabe nicht richtig. Bitte gebe eine Zahl ein!");
                scanner.nextLine();
            }
        }

        double tipp = money / 100 * percantage;
        double total = money + tipp;

        System.out.println("Du sollst ein Trinkgeld von " + tipp + " Euro geben. Heißt, du zahlst insgesamt " + total + " Euro!");

    }

}

Zusammenfassung

In diesem Beitrag hast du die verschiedenen Methoden von der Scanner Klasse aus dem java.util Paket kennengelernt. Damit kannst du nun erste kleine Terminal Programme erfolgreich schreiben. Du bist jetzt fähig eine erste Interaktion zwischen Mensch und Programm herzustellen.

Falls dir jetzt noch weitere Details fehlen zu der Scanner Klasse, wirf doch einmal ein Blick in die Java Dokumentation.

Bildquelle - Vielen Dank an die Ersteller:innen für dieses Bild
Kommentare zum Artikel

Es sind noch keine Kommentare vorhanden? Sei der/die Erste und verfasse einen Kommentar zum Artikel "Java: Terminal Eingaben einlesen mit der Scanner Klasse!"!

Kommentar schreiben

Vom Autor Empfohlen
close