it-swarm.com.de

Wie kann ich den Scanner beenden, wenn die Eingabe abgeschlossen ist?

public static void main(String[] args) {

        Scanner scan = new Scanner(System.in);
        try {
            while (scan.hasNextLine()){

                String line = scan.nextLine().toLowerCase();
                System.out.println(line);   
            }

        } finally {
            scan.close();
        }
    }

Ich frage mich nur, wie ich das Programm beenden kann, nachdem ich die Eingabe abgeschlossen habe? Da der Scanner nach mehrmaligem "Eingeben" immer noch fortfahren würde, vorausgesetzt, ich werde die Eingabe fortsetzen ....

if (scan.nextLine() == null) System.exit(0);

und 

if (scan.nextLine() == "") System.exit(0);  

Sie haben nicht funktioniert .... Das Programm läuft weiter und verwirrt mit der ursprünglichen Absicht,

8
user2318175

Das Problem ist, dass ein Programm (wie das Ihre) nicht weiß, dass der Benutzer die Eingaben abgeschlossen hat, es sei denn, der Benutzer ... sagt es irgendwie ....

Es gibt zwei Möglichkeiten, wie der Benutzer dies tun kann:

  • Geben Sie eine Markierung für das Dateiende ein. Unter UNIX und Mac OS ist das (normalerweise) CTRL+Dund unter Windows CTRL+Z. Dies führt dazu, dass hasNextLine()false zurückgibt.

  • Geben Sie eine spezielle Eingabe ein, die vom Programm als "Ich bin fertig" erkannt wird. Zum Beispiel kann es sich um eine leere Zeile oder einen speziellen Wert wie "exit" handeln. Das Programm muss dies speziell testen.

(Sie können auch einen Timer verwenden und davon ausgehen, dass der Benutzer fertig ist, wenn er N Sekunden oder N Minuten lang keine Eingabe getätigt hat. Dies ist jedoch keine benutzerfreundliche Methode.)


Der Grund, warum Ihre aktuelle Version fehlschlägt, ist, dass Sie == verwenden, um auf eine leere Zeichenfolge zu testen. Sie sollten entweder die Methoden equals oder isEmpty verwenden. (Siehe Wie vergleiche ich Strings in Java? )

Andere zu berücksichtigende Dinge sind die Unterscheidung zwischen Groß- und Kleinschreibung (z. B. "Beenden" und "Beenden") und die Auswirkungen von führenden oder nachfolgenden Leerzeichen (z. B. "Beenden" und "Beenden").

23
Stephen C

Der Zeichenkettenvergleich erfolgt mit .equals() und nicht mit ==.

Also versuche scan.nextLine().equals("").

4
Shobit

Sie müssen nach einem bestimmten Muster suchen, das das Ende Ihrer Eingabe anzeigt, sagen Sie beispielsweise "##".

// TODO Auto-generated method stub
    Scanner scan = new Scanner(System.in);
    try {
        while (scan.hasNextLine()){

            String line = scan.nextLine().toLowerCase();
            System.out.println(line);
            if (line.equals("##")) {
                System.exit(0);
                scan.close();
            }
        }

    } finally {
        if (scan != null)
        scan.close();
    }
1
nchouhan

Bei diesem Ansatz müssen Sie explizit einen Exit-Befehl oder eine Exit-Bedingung erstellen. Zum Beispiel:

String str = "";
while(scan.hasNextLine() && !((str = scan.nextLine()).equals("exit")) {
    //Handle string
}

Darüber hinaus müssen Sie Zeichenfolgengleichungen mit .equals() nicht == behandeln. == vergleicht die Adressen zweier Strings, die, sofern sie nicht tatsächlich dasselbe Objekt sind, niemals wahr sein werden.

0
Aza

In diesem Fall empfehle ich Ihnen, do, while-Schleife anstelle von while zu verwenden.

    Scanner sc = new Scanner(System.in);
    String input = "";
    do{
        input = sc.nextLine();
        System.out.println(input);
    } while(!input.equals("exit"));
sc.close();

Um das Programm zu beenden, müssen Sie lediglich einen String-Header zuweisen, z. Ausfahrt. Wenn die Eingabe gleich dem Ende ist, wird das Programm beendet. Außerdem können Benutzer die Strg-Taste + c drücken, um das Programm zu beenden.

0
Jason

Sie können die nächste Zeile der Eingabe von der Konsole aus überprüfen und prüfen, ob Ihre Eingabe beendet ist (falls vorhanden).

Angenommen, Sie beenden den Eintrag "quit", dann sollten Sie diesen Code ausprobieren: -

Scanner scanner = new Scanner(System.in);
    try {
        while (scanner.hasNextLine()){

            // do  your task here
            if (scanner.nextLine().equals("quit")) {
                scanner.close();
            }
        }

    }catch(Exception e){
       System.out.println("Error ::"+e.getMessage());
       e.printStackTrace();
 }finally {
        if (scanner!= null)
        scanner.close();
    }

Probieren Sie diesen Code aus. Ihre Abschlusszeile sollte von Ihnen eingegeben werden, wenn Sie den Scanner schließen/beenden möchten.