Java: endlos-Schleife mit Scanner.hasNextInt()
Ich bin mit dem folgenden code:
while (invalidInput)
{
//ask the user to specify a number to update the times by
System.out.print("Specify an integer between 0 and 5: ");
if (in.hasNextInt())
{
//get the update value
updateValue = in.nextInt();
//check to see if it was within range
if (updateValue >= 0 && updateValue <= 5)
{
invalidInput = false;
}
else
{
System.out.println("You have not entered a number between 0 and 5. Try again.");
}
} else
{
System.out.println("You have entered an invalid input. Try again.");
}
}
Allerdings, wenn ich geben Sie ein " w " wird es mir sagen, "Sie haben eingegeben ungültige Eingabe. Versuchen Sie es Erneut." und dann geht es in eine Endlosschleife mit dem text "Geben Sie eine Zahl zwischen 0 und 5 ein: Sie haben eingegeben, die eine ungültige Eingabe. Versuchen Sie es erneut."
Warum ist das passiert? Nicht das Programm soll warten, bis der Benutzer die Eingabe und drücken Sie die EINGABETASTE jedes mal, wenn es reicht die Aussage:
if (in.hasNextInt())
Da Sie noch nicht gezeigt jemand was
in
ist, oder wie Sie gebaut, es gibt keine zu sagen, wie er sich Verhalten sollte!InformationsquelleAutor Tomek | 2009-11-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
In Ihrem letzten
else
blockieren, müssen Sie deaktivieren Sie das 'w' oder andere ungültige Eingabe aus dem Scanner. Sie können dies tun, durch aufrufennext()
auf den Scanner ignorieren und Ihr Rückgabewert wegwerfen, ungültige Eingaben, wie folgt:InformationsquelleAutor Kaleb Brasee
Das problem war, dass Sie keinen Fortschritt gemacht haben, die
Scanner
Vergangenheit die problematische Eingang. VonhasNextInt()
Dokumentation:Dies gilt für alle
hasNextXXX()
Methoden: Sie kehrentrue
oderfalse
ohne voran dieScanner
.Hier ist ein Ausschnitt um das problem zu veranschaulichen:
Finden Sie, dass dieses Programm in einer endlos-Schleife, Fragen
int, please!
wiederholt.Wenn Sie die Auskommentierung der
sc.next()
- Anweisung, dann wird es dieScanner
gehen vorbei an den token nicht, dasshasNextInt()
. Das Programm würde dann drucken:Die Tatsache, dass eine fehlgeschlagene
hasNextXXX()
Scheck nicht überspringen Sie die Eingabe ist beabsichtigt: Sie ermöglicht es Ihnen, um weitere Prüfungen durchführen, die auf das token, wenn nötig. Hier ist ein Beispiel zur Verdeutlichung:Wenn Sie dieses Programm ausführen, wird Folgendes ausgegeben:
InformationsquelleAutor polygenelubricants
Diese Aussage von Ben S., über die nicht-blockierenden Aufruf ist falsch:
...obwohl ich erkenne, dass die Dokumentation können leicht falsch eingeschätzt zu geben, dieser Meinung, und der name selbst impliziert, ist es für diesen Zweck verwendet werden. Das relevante Zitat, mit Betonung Hinzugefügt:
Es ist ein subtiler Punkt, um sicher zu sein. Entweder sagen "Beide die hasNext und next-Methoden", oder "Beide hasnext() und next()" würde angedeutet haben, dass die Begleiter Methoden würde anders handeln. Aber zu sehen, wie Sie entsprechen den gleichen naming convention (und die Dokumentation, natürlich), ist es vernünftig zu erwarten, dass Sie das gleiche handeln, und hasNext()
deutlich sagt, dass es blockiert werden kann.
Meta-Anmerkung: dies dürfte wohl ein Kommentar zum falschen Beitrag, aber es scheint, dass als neuer user kann ich nur diesen post Antworten (oder Bearbeiten Sie das wiki, die scheint, werden bevorzugt für sytlistic änderungen, nicht die der Substanz).
InformationsquelleAutor Rich Fletcher
Flag-Variablen sind zu fehleranfällig, zu verwenden. Verwenden Sie die explizite Regelung mit Kommentaren statt. Auch,
hasNextInt()
nicht blockiert. Es ist das nicht-die Blockierung überprüfen, um zu sehen, wenn Sie eine Zukunftnext
nennen konnte input zu erhalten, ohne zu blockieren. Wenn Sie blockieren möchten, verwenden Sie dienextInt()
Methode.dieser code erzeugt eine unendliche Schleife
Ich mache es final da es sich nicht ändern. Der compiler tun könnten, bestimmte Optimierungen, weil dieser. Es ist eine gute Angewohnheit, zu erklären, dass alles sein kann, endgültig. Die Schleife wird abgebrochen, wenn der Benutzer die richtige Eingabe. Es ist nur unendlich, wenn die Benutzer wählen, um es unendlich. Wenn Sie wollen, kann ich es Bearbeiten, so dass es nur für eine bestimmte Anzahl von Wiederholungen.
Ich meine, wenn ich geben Sie ein " w " geht es in eine Endlosschleife der Anzeige "Geben Sie eine Zahl zwischen 0 und 5 ein: Sie haben eingegeben, die eine ungültige Eingabe. Versuchen Sie es erneut." "Geben Sie eine Zahl zwischen 0 und 5 ein: Sie haben eingegeben, die eine ungültige Eingabe. Versuchen Sie es erneut." "Geben Sie eine Zahl zwischen 0 und 5 ein: Sie haben eingegeben, die eine ungültige Eingabe. Versuchen Sie es erneut." und so weiter. Es war nicht, bis ich Hinzugefügt, die in.next() in den catch-Anweisung zu "klar 'w' oder andere ungültige Eingabe aus dem Scanner" wie Brassen, sagte. Nicht verwandt, aber Sie produzieren einige code-Qualität
Ich Update mein Beispiel richtig zu verwerfen, nicht-int-Eingänge.
InformationsquelleAutor Ben S