Scanner nextLine-skipping() nach der Verwendung von next() oder nextFoo()?
Ich bin mit der Scanner
Methoden nextInt()
und nextLine()
für das Lesen-Eingang.
Sieht es wie folgt aus:
System.out.println("Enter numerical value");
int option;
option = input.nextInt(); //Read numerical value from input
System.out.println("Enter 1st string");
String string1 = input.nextLine(); //Read 1st string (this is skipped)
System.out.println("Enter 2nd string");
String string2 = input.nextLine(); //Read 2nd string (this appears right after reading numerical value)
Das problem ist, dass nach der Eingabe des numerischen Wertes des ersten input.nextLine()
übersprungen und der zweite input.nextLine()
ausgeführt wird, so dass meine Ausgabe sieht wie folgt aus:
Enter numerical value
3 //This is my input
Enter 1st string //The program is supposed to stop here and wait for my input, but is skipped
Enter 2nd string //...and this line is executed and waits for my input
Getestet habe ich meine Anwendung und wie es aussieht, das problem liegt in der Verwendung input.nextInt()
. Wenn ich es löschen, dann beide string1 = input.nextLine()
und string2 = input.nextLine()
ausgeführt werden, wie ich Sie haben will.
Verwandte: stackoverflow.com/questions/4708219/...
Der newline-character ist wohl nicht verzehrt werden.
Stil-Hinweis: Sie sollten erklären, Ihren String-Variablen in der gleichen Zeile einen Wert zuweisen. E. g.
Darin: ja, du hast Recht. Nach ein paar test habe ich festgestellt, dass es ausgeführt wird, und Lesen Sie "\n". Wie zu vermeiden?
Oder Sie könnten sein wie ich und verwenden BufferedReader 🙂 I don ' T care, wenn es ist alte Schule, es hat immer geklappt und wird es auch immer Arbeit für mich. Auch, die Kenntnis der BufferedReader hat die Anwendung an anderer Stelle. Ich weiß einfach nicht, wie Scanner.
Der newline-character ist wohl nicht verzehrt werden.
Stil-Hinweis: Sie sollten erklären, Ihren String-Variablen in der gleichen Zeile einen Wert zuweisen. E. g.
String string1 = input.nextLine ()
.Darin: ja, du hast Recht. Nach ein paar test habe ich festgestellt, dass es ausgeführt wird, und Lesen Sie "\n". Wie zu vermeiden?
Oder Sie könnten sein wie ich und verwenden BufferedReader 🙂 I don ' T care, wenn es ist alte Schule, es hat immer geklappt und wird es auch immer Arbeit für mich. Auch, die Kenntnis der BufferedReader hat die Anwendung an anderer Stelle. Ich weiß einfach nicht, wie Scanner.
InformationsquelleAutor blekione | 2012-10-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das ist, weil die
Scanner.nextInt
Methode nicht Lesen Sie die newline Zeichen in Ihre Eingabe erstellt durch drücken von "Enter", und so den Anruf zuScanner.nextLine -
zurück nach der Lektüre, dass newline.Tritt ein ähnliches Verhalten, wenn Sie verwenden
Scanner.nextLine
nachScanner.next()
oder jedeScanner.nextFoo
Methode (außernextLine
selbst).Problemumgehung:
Entweder einen
Scanner.nextLine
rufen Sie nach jederScanner.nextInt
oderScanner.nextFoo
zu konsumieren rest der Zeile darunter newlineOder, noch besser, Lesen Sie die Eingabe durch
Scanner.nextLine
und konvertieren Sie Ihre Eingabe das richtige format, die Sie benötigen. Zum Beispiel können Sie konvertieren eine ganze Zahl mitInteger.parseInt(String)
Methode.try-catch
, weilInteger.parseInt
wirftNumberFormatException
wenn ein ungültiges argument übergeben wird. Sie erfahren mehr über die Ausnahme später auf. Für E. G: -Integer.parseInt("abc")
. Sie wollen nicht "abc", um in int konvertiert, richtig?So, im obigen Fall wird der code halt an diesem Punkt, und Sie werden nicht in der Lage, weiterhin die Ausführung. Mit Exception-Handling, können Sie behandeln diese Art von Bedingungen.
Inwiefern ist die letztere besser? AFAIK Scanner#nextInt() ist Weg, mehr Nachsicht bei der Suche nach korrekte int-Werte, durch die eine Gruppe von Kommas und locale Präfixe und Suffixe. Integer#parseInt() können Ziffern und Dezimalpunkt nur plus einem optionalen Vorzeichen.
Ich persönlich bevorzuge eine
Scanner#hasNextFoo
überprüfen Sie vorher, statt eines try-catch, aber das funktioniert auch.Verwenden ParseDouble hat ein neues problem, dass nextDouble verwenden Sie die regionale Konfiguration des dezimal - (. oder ,) aber Parsedouble immer von UNS erhalten dezimal ( . ).
InformationsquelleAutor Rohit Jain
Ist das problem mit der Eingang.nextInt() Methode - es liest nur den int-Wert. Also, wenn Sie weiter Lesen mit input.nextLine - () erhalten Sie die "\n" Enter-Taste. So überspringen Sie dies, müssen Sie die Eingang.nextLine - (). Hoffe, das sollte nun verständlich sein.
Versuchen Sie es so:
nextLine
, aber ich brauche noch eine Erklärung für dieses VerhaltenFYI: zusammengeführt aus stackoverflow.com/questions/7056749/...
InformationsquelleAutor Prine
Es ist, weil, wenn Sie eine Zahl eingeben, dann drücken Sie die Taste Enter,
input.nextInt()
verbraucht nur die Anzahl, nicht die "end-of-line". Wenninput.nextLine()
ausgeführt wird, verbraucht er die "end of line" noch in den Puffer aus der ersten Eingabe.Verwenden Sie stattdessen
input.nextLine()
sofort nachinput.nextInt()
es ist kein bug. es funktioniert wie angegeben. man könnte argumentieren aber, dass, sollte es eine einfache Möglichkeit zu sagen, die api zu nutzen auch alle whitespace-Zeichen nach der Ziel-Eingabe.
Ich sehe. danke @Boheme, dass genau das, was ich argumentiere. Ich denke, dies sollte geändert werden, können Sie vielleicht zeigen Sie mir, wo Sie zu empfehlen dieses "Problem" in den nächsten JCP.
Sie können auf Anfrage (und finden Sie heraus, wie Sie dazu beitragen-code) ein feature über die Report a Bug oder Request a Feature Seite.
FYI: zusammengeführt aus stackoverflow.com/questions/7056749/...
InformationsquelleAutor Bohemian
Scheint es viele Fragen über dieses Problem mit
java.util.Scanner
. Ich denke, ein mehr lesbar/idiomatische Lösung wäre zu nennenscanner.skip("[\r\n]+")
fallen alle neue-Zeile-Zeichen nach dem AufrufnextInt()
.EDIT: wie @PatrickParker unten, das wird eine unendliche Schleife verursachen, wenn der Benutzer Eingaben alle whitespace-Zeichen nach der Nummer. Finden Sie Ihre Antworten für ein besseres Muster zu verwenden mit überspringen: https://stackoverflow.com/a/42471816/143585
Ich weiß, was wir tun, um zu entfernen die Daten im buffer, aber in diesem Fall, bitte helfen Sie mir mit diesem: stackoverflow.com/questions/33585314/having-issues-with-scanner
FYI, das wird eine unendliche Schleife verursachen, ist der Benutzer keine tabs oder Leerzeichen nach der numerischen Eingabe. Siehe meine Antwort hier für eine bessere überspringen: stackoverflow.com/a/42471816/7098259
es ist in der Tat eine unendliche Schleife verursachen! Vielen Dank, bearbeitet die Antwort auf link zu verkaufen.
Warum ist Ursache Endlosschleife ?
InformationsquelleAutor Denis Tulskiy
Er macht das, weil
input.nextInt();
erfasst nicht die Zeile. Sie könnte wie die anderen vorgeschlagen, indem eininput.nextLine();
darunter.Alternativ können Sie es tun C# - Stil und analysieren eine nextLine-eine Ganzzahl etwa so:
Tun, dieser funktioniert genauso gut, und es spart eine Zeile code.
Sie müssen mit try-catch hier. Was wird passieren, wenn die Eingabe keine Zahl ist. NumberFormatException müssen dort behandelt werden.
Dies setzt Voraus, dass es nur einen int-token auf jeder Linie, die Sie versuchen, diese für.
InformationsquelleAutor Electric Coffee
Dinge, die Sie wissen müssen:
text steht paar Zeilen enthält auch nicht-druckbare Zeichen zwischen den Zeilen (wir nennen Sie line Separatoren) wie
"\r"
)"\n"
)wenn Sie das Lesen von Daten von der Konsole, die es dem Benutzer ermöglicht, die Art seiner Reaktion, und wenn er fertig ist, muss er irgendwie bestätigen diese Tatsache. Dazu muss der Benutzer die Taste "enter"/"return" - Taste auf der Tastatur.
Wichtig ist, dass dieser Schlüssel neben der Sicherstellung der Platzierung Benutzer Daten zu standard-Eingabe (vertreten durch
System.in
die vonScanner
) sendet auch OS abhängig Zeile Trennzeichen (wie für Windows\r\n
) nach.So, wenn du fragst den user für Wert wie
age
- und user-Typen 42 und drückt die EINGABETASTE, standard-Eingabe enthalten"42\r\n"
.Problem
Scanner#nextInt
(und andereScanner#nextType
Methoden) nicht erlaubt, Scanner verbrauchen diese Zeile Trennzeichen. Gelesen werden Sie vonSystem.in
(wie sonst Scanner würde wissen, dass es keine weiteren Ziffern vom Benutzer darstellenage
Wert als Verkleidung Leerzeichen?) das entfernt Sie von der standard-Eingabe, aber es wird auch cache diese Linie Separatoren intern. Was wir brauchen, sich daran zu erinnern, ist, dass alle von den Scanner-Methoden sind immer Scannen ausgehend von der zwischengespeicherte text.Nun
Scanner#nextLine()
einfach speichert und gibt alle Zeichen , bis er Sie findet-line Separatoren (oder end of stream). Aber da line Separatoren nach dem Lesen der Zahl von der Konsole gefunden werden, sofort in Scanner-cache, es gibt eine leere Zeichenfolge, was bedeutet, dass der Scanner war nicht in der Lage zu finden alle Zeichen vor diese Zeile Trennzeichen (oder end of stream).BTW
nextLine
auch verbraucht diese Zeile Trennzeichen.Lösung
Also, wenn Sie wollen, Fragen Sie nach Zahl und dann für die gesamte Linie, während zu vermeiden, dass ein leerer string als Ergebnis
nextLine
entwedernextInt
von Scannern cachenextLine
,skip("\\R")
zu lassen, Scanner skip Teil ergänzt durch\R
vertritt line separator (mehr info über\R
: https://stackoverflow.com/a/31060125)nextInt
(nochnext
oder jedenextTYPE
Methoden). Stattdessen Lesen Sie gesamten Daten zeilenweise mitnextLine
und analysieren der zahlen aus jeder Zeile, (vorausgesetzt, eine Zeile enthält nur eine Zahl), um die richtige Art, wieint
überInteger.parseInt
.BTW:
Scanner#nextType
Methoden können überspringen Trennzeichen (standardmäßig werden alle Leerzeichen wie tabs, line-Separatoren), einschließlich derjenigen im Cache-scanner, bis Sie finden neben nicht-trennwert (token). Vielen Dank für input wie"42\r\n\r\n321\r\n\r\n\r\nfoobar"
codewird in der Lage sein, um richtig zuordnen
num1=42
num2=321
name=foobar
.InformationsquelleAutor Pshemo
Statt
input.nextLine()
verwendeninput.next()
, das sollte das problem lösen.Modifizierte code:
InformationsquelleAutor Castaldi
In der Reihenfolge, um das Problem zu vermeiden, verwenden Sie
nextLine();
sofort nachnextInt();
wie es hilft bei der Entrümpelung der Puffer. Wenn Sie die TasteENTER
dienextInt();
erfasst nicht die neue Zeile, und somit überspringt dieScanner
code später.InformationsquelleAutor Urvashi Gupta
Wenn Sie Scannen möchten, der Eingang schnell ohne immer verwirrt in Scanner nextLine-Klasse () - Methode Verwenden Sie Benutzerdefinierte Input-Scanner für Sie .
Code :
Vorteile :
Methoden :
Verwendung :
ScanReader sc = new ScanReader(System.in);
3. Import benötigten Klassen :
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
4. Werfen IOException aus deiner main-Methode zum verarbeiten der Ausnahme
5. Die Nutzung Der Methoden.
6. Genießen Sie
Beispiel :
InformationsquelleAutor NIKUNJ KHOKHAR
Wenn Sie möchten, Lesen Sie die beiden Zeichenfolgen und Ganzzahlen, eine Lösung ist die Verwendung von zwei Scannern:
InformationsquelleAutor André Valenti
sc.nextLine()
ist besser als im Vergleich zum Parsen des Inputs.Da die Leistung klug, es wird gut sein.
InformationsquelleAutor shankar upadhyay
Ich denke, ich bin ziemlich spät zu der party..
Wie bereits erwähnt, ruft
input.nextLine()
nachdem Ihr int-Wert wird Ihr problem lösen. Der Grund, warum dein code nicht funktioniert hat, war, weil es war nichts anderes zu speichern, aus Ihrer Eingabe (wo Sie eingegeben int) instring1
. Werde ich nur werfen ein wenig mehr Licht auf das gesamte Thema.Betrachten nextLine - () wie die odd man out unter den nextFoo() Methoden der Scanner-Klasse. Nehmen wir mal ein Beispiel.. nehmen wir an, wir haben zwei code-Zeilen wie die folgenden:
Wenn wir geben Sie den Wert unten (als einzelne Zeile)
Den Wert unserer
firstNumber
undsecondNumber
Variablen werden 54 und 234 beziehungsweise. Der Grund, warum dies funktioniert auf diese Weise, weil ein neuer line feed (ich.e \n) IST NICHT automatisch generiert, wenn die nextInt() Methode nimmt in den Werten. Es nimmt einfach die "weiter " int" und bewegt sich auf. Dies ist das gleiche für den rest der nextFoo () - Methoden außer nextLine - ().nextLine - () erzeugt eine neue Zeile Futter sofort nach der Einnahme einen Wert; das ist, was @RohitJain bedeutet mit den Worten, das neue line-feed "verbraucht".
Schließlich die Methode next() nimmt einfach den nächsten String ohne erzeugen eine neue Zeile ein; dies macht dies die bevorzugte Methode für die Aufnahme von separaten Zeichenfolgen in der gleichen Zeile.
Ich hoffe das hilft.. Frohes Programmieren!
Eine neue line feed) bedeutet grundsätzlich 'ab eine neue Zeile'.
InformationsquelleAutor Taslim Oseni
InformationsquelleAutor Neeraj Gahlawat
Verwenden Sie 2-scanner-Objekte anstelle von einem
InformationsquelleAutor Harsh Shah
Warum nicht einen neuen Scanner für jeden zu Lesen? Wie im Bild unten gezeigt. Mit diesem Ansatz werden Sie nicht, stellen Sie sich Ihrem problem.
Scanner
um zu verhindern, dass Speicher-Leck. Zeit zu verschwenden?Nicht die GC kümmern, wenn der Scanner verpackt in einer Methode? Wie: String getInput() {return new Scanner(System.in).nextLine - ()};
Das ist absolut falsch.
nextInt()
nicht zu verbrauchen, das neue-Zeile-unabhängig davon, ob es in einem "neuen"Scanner
oder ein bereits gebrauchtes.InformationsquelleAutor Tobias Johansson