Scanner: Unterschied zwischen den Versionen

Aus Programmieren-Wiki
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
(Eine dazwischenliegende Version desselben Benutzers wird nicht angezeigt)
Zeile 5: Zeile 5:
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.
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:
Dafür gibt es zwei Möglichkeiten:
# <syntaxhighlight inline lang="Java">Scanner::close()</syntaxhighlight>: <br>Wie oben beschrieben, schließt close() den zugrundeliegenden InputStream.
# <syntaxhighlight inline lang="Java">Scanner::close()</syntaxhighlight>: <br>Methode der Scanner-Klasse die den zugrundeliegenden InputStream schließt.
# try-with-ressources: <br>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-with-ressources: <br>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.
<syntaxhighlight lang="Java">
<syntaxhighlight lang="Java">

Aktuelle Version vom 17. Oktober 2024, 11:12 Uhr

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

  1. Scanner::close():
    Methode der Scanner-Klasse die den zugrundeliegenden InputStream schließt.
  2. 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.