Scanner
🚧 | Diese Seite befindet sich in Bearbeitung | 🚧 |
🤓 | Diese Seite ist eine Bewertungsrichtlinie, die ab Blatt 1 annotiert und ab Blatt 2 abgezogen wird. | 🤓 |
Beschreibung
Wir benutzen den Scanner des java.util Paketes um Eingaben von einem beliebigen InputStream zu lesen. Insbesondere wollen wir in diesem Übungsbetrieb den InputStream des System.in lesen um Benutzereingaben der Kommandozeile einzulesen. Abgesehen davon, können auch diverse andere InputStreams lesen, so zum Beispiel Dateien oder Netzwerkverkehr. Für sämtliche Ressourcen dieser Art ist es wichtig, diese nach der Verwendung wieder zu schließen, damit zum Beispiel andere Programme auch auf die Datei zugreifen können. Dafür gibt es zwei Möglichkeiten:
Scanner::close()
:
Methode der Scanner-Klasse die den zugrundeliegenden InputStream schließt.- try-with-ressources:
Ein try-with-ressources Block ähnelt einem try-catch-Block. Am Ende des Blocks wird die angegebene Ressource automatisch geschlossen und es wird von dem Compiler verhindert, dass der geschlossene Scanner außerhalb des Blocks verwendet wird.
try (Scanner scanner = new Scanner(System.in)) {
//...
String line = scanner.nextLine();
//...
}
Negativbeispiel
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String line = scanner.nextLine();
// do something with the line
if (line.equals("quit")) {
break;
}
}
}
Der Scanner wird hier nicht geschlossen und blockiert dadurch den InputStream.
Positivbeispiel
public static void main(String[] args) {
try (Scanner scanner = new Scanner(System.in)) {
while (scanner.hasNext()) {
String line = scanner.nextLine();
// do something with line
if (line.equals("quit")) {
break;
}
}
}
}
Hier wird der Scanner durch einen try-with-ressources bereitgestellt und damit auch automatisch nach austreten des Blocks geschlossen. Alternativ kann auch folgendes geschrieben werden:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String line = scanner.nextLine();
// do something with line
if (line.equals("quit")) {
break;
}
}
scanner.close();
}
Diese Variante erfordert lediglich selbst daran zu denken, den Scanner nach beenden des Programms zu schließen.