Warum hasNextLine() nie zu Ende?
Sorry, wenn dies klingt zu einfach. Ich bin sehr neu in Java.
Hier ist einige einfache code, den ich mit zu untersuchen hasNextLine()
. Bei mir läuft es, ich kann es nicht stoppen. Ich dachte, wenn Sie nicht schreiben Sie einen beliebigen Eingang und drückte die Enter, Sie würden die Flucht der while
Schleife.
Kann mir jemand erklären, wie hasNextLine()
funktioniert in dieser situation?
import java.util.*;
public class StringRaw {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNextLine()) {
String str = sc.nextLine();
}
System.out.print("YOU'VE GOT THROUGH");
}
}
- Drücken Sie Strg-Z ( Windows ) oder Ctrl-D ( Unix )
- seinen Strg+C in unix-glaube ich (und ich denke, es ist das gleiche in windows als auch)
- Das funktioniert auch, aber ich denke, Strg-C beendet den Prozess unmittelbar.
- Ja ... Wenn Sie geben Sie Strg-C, Sie wird nicht die "DU HAST ÜBER" Nachricht.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beim Lesen aus dem System.Sie Lesen von der Tastatur, von Standard, und das ist eine unendliche Eingabe-stream... es hat so viele Zeilen, wie der Benutzer kümmert sich zu geben. Ich denke, das senden der Steuersequenz für EOF funktionieren könnte, wie STRG-Z (oder STRG-D?).
Blick auf meine good-ol' ASCII-Tabelle... CTL-C ist ein ETX-und CTL-D ist ein EOT; entweder sollte die Arbeit zu beenden, eine text-stream. STRG-Z ist eine SUB, die sollte nicht Arbeit (aber es könnte, da Kontrollen sind historisch interpretiert, höchst subjektiv).
Drücken Sie Strg + D, um zu beenden-Eingabe von stdin. (Windows: Strg + Z) oder die Eingabe über einen Befehl ein:
STRG-D wird das Ende-Zeichen oder byte-stream für UNIX/Linux-und STRG-Z ist das Ende-Zeichen oder byte-stream für Windows (ein historisches Artefakt aus den frühen Tagen der Microsoft-DOS).
Mit der Frage code, wie geschrieben, eine leere Zeile, nicht beenden Sie die Schleife, weil hasNextLine() nicht false. Es wird ein Zeilenende-Zeichen in der Eingabe-byte-stream.
System.in einen byte-stream von der Standardeingabe, normalerweise die Konsole. Ende der byte-stream wird daher beenden die Schleife. Obwohl nextLine - () nicht blockiert auf eine Eingabe wartet, hasNextLine() liefert. Nur so wird der code beendet wird, wie vorgesehen, ist mit STRG-Z in Windows-oder STRG-D in UNIX/Linux, die enden der byte-stream, verursacht hasNextLine() nicht zu blockieren, auf eine Eingabe wartet und wieder ein false beendet die while-Schleife.
Wenn Sie möchten, es zu beenden mit einer leeren line-Eingang können Sie überprüfen, für nicht-leeren Zeilen als Teil der Schleife Fortsetzung Zustand. Der folgende code zeigt, wie Sie ändern die grundlegende Frage design mit hasNextLine() und nextLine - () zu einem, der beendet ist, wenn es wird eine leere Zeile, oder ein end-of-input-Zeichen (d.h. STRG-Z in Windows oder CTRL-D (UNIX/Linux). Der zusätzliche code in der while-Bedingung verwendet eine Funktion von Operatoren, wobei Sie ausgewertet werden können, wie ein Ausdruck der Wert, der zugewiesen wurde. Da es ein String-Objekt, den String.equals () - Methode kann verwendet werden, mit der Auswertung.
Anderen zusätzlichen code fügt nur einige gedruckte Ausgabe zu machen, was Los ist, auf der Hand.
Gemäß meinem Verständnis , wenn man mal ein Beispiel von ResultSet-Objekt von JDBC-oder-jeder iterator ist dann in diesen Fällen muss man von einer endlichen Menge von Dingen und Iteratoren jedes mal prüfen, ob Ende des Satzes erreicht wurde.
Aber im obigen Fall gibt es keine Möglichkeit zu wissen, das Ende der Benutzereingabe, d.h. hasNextLine() hat keine Möglichkeit zu wissen, wenn der Benutzer wünscht, zu beenden, und damit geht es auf unendlich.
Beste Weg ist, um zusätzliche Bedingung in der for-Schleife prüft eine Bedingung im inneren for-Schleife, scheitert in der Zukunft.
Im obigen post @Jim 's Antwort verdeutlicht dies.
In der Tat mit hasNextLine() als Schleife terminator für console input sollte entmutigt werden, weil es nie false zurückgeben.
Ich hatte ein ähnliches problem mit einem socket-input-stream. Die meisten Lösungen, die ich gefunden würde, noch blockieren Sie die Ausführung. Es stellt sich heraus, es ist eine nicht-blockierende überprüfen, die Sie tun können, mit InputStream.verfügbar().
So auch in diesem Fall sollten die folgenden arbeiten: