2016-06-01 9 views
-1

Kann der Code unter korrekt ausgeführt werden, ohne ein neues Scannerobjekt innerhalb der Schleife zu erstellen?Java: Handle Scannereingabe innerhalb einer Schleife mit nur einem Scannerobjekt

Kann es mit nur einer Definition eines Scanner-Objekts außerhalb der Schleife getan werden (kommentierter Code)?

// Scanner sc = new Scanner(System.in); 
while(true){ 
    Scanner sc = new Scanner(System.in); 
    try{ 
    int x = sc.nextInt(); 
    System.out.printf("You gave %d\n", x); 
    }catch(Exception e){ 
    System.out.println("Plz give a valid number!"); 
    }finally{ 
    sc.close(); 
    } 
} 
+0

möchten Sie, sobald Sie gültige Nummer bekommen dann nicht mehr fragen? ich meine einmal gültigen Wert bekommen dann von while loop befreien wollen? –

+0

Schließen des Scanners: [java.util.NoSuchElementException - Scanner lesen Benutzereingaben] (http://Stackoverflow.com/q/13042008) – Tom

+0

@vishalgajera Nein, ich möchte nur eine Nummer geben, dann sagen Sie mir die Nummer und Wenn die Schleife beginnt, geben Sie erneut eine neue Eingabe! – Skemelio

Antwort

1

Wenn Sie den Scanner außerhalb der Schleife zu definieren, verwenden Sie die gleichen Scanner bei jedem Durchlauf der Schleife. Wenn das nächste Token keine gültige Ganzzahl ist, schlägt sc.nextInt() fehl und der Scanner wird nicht über diesen Token hinausgehen. Bei der nächsten Iteration wird sc.nextInt() dasselbe ungültige Token angezeigt und wird erneut fehlschlagen. Wenn Sie den Scanner schließen, ruft die nächste Iteration der Schleife sc.nextInt() auf dem geschlossenen Scanner auf, was fehlschlagen wird. Nachfolgende Iterationen werden aus dem gleichen Grund fehlschlagen.

Auf der anderen Seite, wenn der Scanner innerhalb der Schleife definiert ist, verwendet jede Iteration einen neuen Scanner. Selbst wenn sc.nextInt() fehlschlägt, verwendet die nächste Iteration einen neuen Scanner, der nicht dasselbe ungültige Token enthält.

+0

Also ist die einzige Lösung, einen neuen Scanner die ganze Zeit zu erstellen? Und schließe es natürlich? Aber braucht das nicht viel Ressourcen, CPU und so weiter? :( – Skemelio

+0

@Skemelio Nein gibt es andere Möglichkeiten, dies zu lösen, lesen Sie einfach die doppelte Frage (siehe den Link über Ihre Frage). – Tom

Verwandte Themen