CodeGym/Java-Blog/Germany/Scanner-Klasse
Autor
Milan Vucic
Programming Tutor at Codementor.io

Scanner-Klasse

Veröffentlicht in der Gruppe Germany
Hallo! Unsere heutige Lektion wird etwas Besonderes sein! Bisher war das Erledigen von Aufgaben und das Schreiben von Programmen ganz einfach: Wir schreiben etwas Code, führen die main()-Methode aus, das Programm tut, was erforderlich ist, und wir sind fertig. Aber jetzt wird sich alles ändern! Heute werden wir lernen, wie wir wirklich mit dem Programm interagieren: Wir bringen ihm bei, auf unsere Aktionen zu reagieren! Bevor wir mit der Analyse des Codes beginnen: Hast du schon einmal mit einem Gerät wie einem Scanner zu tun gehabt? Wahrscheinlich. Das Innenleben eines Scanners ist ziemlich kompliziert, aber die Grundidee, wie er funktioniert, ist sehr einfach: Er liest Daten, die der Benutzer zur Verfügung stellt (z. B. einen Reisepass oder eine Versicherungspolice) und speichert diese Informationen im Speicher (z. B. als Bild). Heute wirst du deinen eigenen Scanner erstellen! Natürlich kann er keine Papierdokumente verarbeiten, aber Text ist kein Problem für ihn :) Los geht's!

Javas Scanner-Klasse

Zuallererst müssen wir uns mit der Klasse java.util.Scanner vertraut machen. Ihre Funktionsweise ist sehr einfach. Wie ein echter Scanner liest auch der Java-Scanner Daten von einer Quelle, die du angibst. Zum Beispiel eine Zeichenkette, eine Datei oder die Konsole. Dann erkennt er die Informationen und verarbeitet sie entsprechend. Hier ist das einfachste Beispiel:
public class Main {

   public static void main(String[] args) {

       Scanner scanner = new Scanner("It matters not how strait the gate,\n" +
               "How charged with punishments the scroll,\n" +
               "I am the master of my fate,\n" +
               "I am the captain of my soul");
       String s = scanner.nextLine();
       System.out.println(s);
   }
}
Wir haben ein Scanner-Objekt erstellt und seine Datenquelle (eine Textzeichenfolge) angegeben. Die Methode nextLine() greift auf die Datenquelle (unseren Text mit einem Vierzeiler) zu, findet die nächste ungelesene Zeile (in diesem Fall die erste Zeile) und gibt sie zurück. Dann zeigen wir sie auf der Konsole an: Konsolenausgabe:

It matters not how strait the gate,
Wir können die Methode nextLine() mehrmals verwenden und den gesamten Gedichtauszug anzeigen:
public class Main {

   public static void main(String[] args) {

       Scanner scanner = new Scanner("It matters not how strait the gate,\n" +
               "How charged with punishments the scroll,\n" +
               "I am the master of my fate,\n" +
               "I am the captain of my soul");
       String s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
   }
}
Jedes Mal macht unser Scanner einen Schritt vorwärts und liest die nächste Zeile. Die Ausgabe des Programms wird angezeigt:

It matters not how strait the gate, 
How charged with punishments the scroll, 
I am the master of my fate, 
I am the captain of my soul
Wie wir bereits gesagt haben, muss die Datenquelle des Scanners nicht unbedingt ein String sein. Es kann zum Beispiel auch die Konsole sein. Aufregende Neuigkeiten für dich: Bisher haben wir dort nur Daten angezeigt, aber jetzt werden wir auch Daten von der Tastatur einlesen! Schauen wir uns an, was die Klasse Scanner sonst noch kann:
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter a number:");

       int number = sc.nextInt();

       System.out.println("Thanks! You entered the number " + number);

   }
}
Die Methode nextInt() liest die eingegebene Zahl und gibt sie zurück. In unserem Programm verwenden wir sie, um der Variablen number einen Wert zuzuweisen. Jetzt sieht es schon eher wie ein echter Scanner aus! Das Programm fordert den Benutzer auf, eine beliebige Zahl einzugeben. Nachdem der Benutzer dies getan hat, bedankt sich das Programm bei ihm, zeigt das Ergebnis an und beendet sich. Aber wir haben immer noch ein ernstes Problem. Der Benutzer könnte einen Fehler machen und etwas Falsches eingeben. Hier ist ein Beispiel, bei dem unser aktuelles Programm nicht mehr funktioniert:
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter a number:");

       int number = sc.nextInt();

       System.out.println("Thanks! You entered the number " + number);

   }
}
Versuchen wir, die Zeichenfolge „CodeGym“ anstelle einer Zahl einzugeben: Konsolenausgabe:

Enter a number: 
CodeGym 
Exception in thread "main" java.util.InputMismatchException 
at java.util.Scanner.throwFor(Scanner.java:864) 
at java.util.Scanner.next(Scanner.java:1485) 
at java.util.Scanner.nextInt(Scanner.java:2117) 
at java.util.Scanner.nextInt(Scanner.java:2076) 
at Main.main(Main.java:10) Process finished with exit code 1
Oh, oh. Wir sind in großen Schwierigkeiten -_- Um solche Situationen zu vermeiden, müssen wir eine Möglichkeit finden, die vom Benutzer eingegebenen Daten zu überprüfen. Wenn der Benutzer zum Beispiel etwas anderes als eine Zahl eingibt, wäre es gut, eine Warnung anzuzeigen, dass die eingegebene Information keine Zahl ist. Und wenn die Informationen in Ordnung sind, dann können wir sie bestätigen. Aber dazu müssten wir „in die Zukunft schauen“, um zu sehen, was in unserem Stream auf uns zukommt. Kann Scanner das tun? Und wie! Dafür gibt es eine ganze Reihe von Methoden: hasNextInt() – Diese Methode prüft, ob der nächste Teil der Eingabedaten eine Zahl ist (und gibt je nach Fall true oder false zurück). hasNextLine() – Diese Methode prüft, ob der nächste Teil der Eingabedaten eine Zeichenkette ist. hasNextByte(), hasNextShort(), hasNextLong(), hasNextFloat(), hasNextDouble() – All diese Methoden führen ähnliche Prüfungen für die übrigen Datentypen durch. Scanner-Klasse - 1Versuchen wir, unser Zahlenleseprogramm zu ändern:
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter a number:");

       if (sc.hasNextInt()) {
           int number = sc.nextInt();
           System.out.println("Thanks! You entered the number " + number);
       } else {
           System.out.println("Sorry, but this is clearly not a number. Restart the program and try again!");
       }

   }
}
Jetzt prüft unser Programm, ob das nächste eingegebene Zeichen eine Zahl ist. Und es wird nur dann eine Bestätigung angezeigt, wenn es so ist. Wenn die Eingabe die Prüfung nicht besteht, nimmt das Programm dies zur Kenntnis und bittet den Benutzer, es erneut zu versuchen. Im Grunde kannst du mit dem Scanner-Objekt kommunizieren und im Voraus herausfinden, welcher Datentyp dich erwartet. Eine Zahl, eine Zeichenkette oder etwas anderes? Eine Zahl? Und welcher Datentyp? Ein int, short, long?“ Diese Flexibilität gibt dir die Möglichkeit, eine Programmlogik zu entwickeln, die vom Verhalten des Benutzers abhängt. Wir sollten uns eine weitere wichtige Methode ansehen: useDelimiter(). Du übergibst dieser Methode eine Zeichenkette. Die Zeichenkette enthält die Zeichen, die du als Trennzeichen oder Begrenzer verwenden willst. Nehmen wir zum Beispiel an, wir interessieren uns plötzlich für japanische Poesie und beschließen, unseren Scanner zu benutzen, um einige Haiku des großen Dichters Matsuo Bashō zu lesen. Selbst wenn uns drei verschiedene Verse als eine unhandliche Zeichenkette übergeben werden, können wir sie leicht aufteilen und schön wiedergeben:
public class Main {
   public static void main(String[] args) {
       Scanner scan = new Scanner("On a withered branch'" +
               "A crow has alighted.'" +
               "Nightfall in autumn." +
               "''***''" +
               "Such a moon above,'" +
               "Like a tree cut at the root:'" +
               "he fresh cut is white." +
               "''***''" +
               "How the river floods!'" +
               "A heron wanders on short legs,'" +
               "Knee-deep in the water.");

       scan.useDelimiter("'");

       while (scan.hasNext()) {
           System.out.println(scan.next());
       }

       scan.close();
   }
}
Wir verwenden "\n/*/*/*"(Neue-Zeile-Zeichen und drei Sternchen) als Trennzeichen. Als Ergebnis haben wir eine schöne Konsolenausgabe, genau wie in den Büchern:
On a withered branch 
A crow has alighted. 
Nightfall in autumn. 

*** 

Such a moon above, 
Like a tree cut at the root: 
The fresh cut is white. 

*** 

How the river floods! 
A heron wanders on short legs, 
Knee-deep in the water.
Dieses Beispiel hat noch eine weitere Methode, auf die wir unbedingt hinweisen müssen: close(). Wie jedes Objekt, das mit E/A-Streams arbeitet, muss der Scanner geschlossen werden, wenn er fertig ist, damit er keine Ressourcen des Computers mehr verbraucht. Vergiss niemals die Methode close()!
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter a number:");

       int number = sc.nextInt();

       System.out.println("Thanks! You entered the number " + number);

       sc.close(); // Now we've done everything right!

   }
}
Das war‘s. Wie du siehst, ist die sehr nützliche Klasse Scanner ziemlich einfach zu benutzen! :)
Kommentare
  • Beliebt
  • Neu
  • Alt
Du musst angemeldet sein, um einen Kommentar schreiben zu können
Auf dieser Seite gibt es noch keine Kommentare