Erste Benutzer-Eingabe mit Scanner
Ich versuche, ein scanner Eingabe in eine Schleife. Sobald der Benutzer will, zu beenden, kann er aus dieser Schleife. Ich habe versucht, viele verschiedene Möglichkeiten, es zu tun, aber es ist immer ein problem. Dies ist der code:
private void inputEntries() {
Scanner sc = new Scanner(System.in);
System.out.println("Continue?[Y/N]");
while (sc.hasNext() && (sc.nextLine().equalsIgnoreCase("y"))) {//change here
System.out.println("Enter first name");
String name = sc.nextLine();
System.out.println("Enter surname");
String surname = sc.nextLine();
System.out.println("Enter number");
int number = sc.nextInt();
Student student = new Student(name, surname, number);
students.add(student);
try {
addToFile(student);
} catch (Exception ex) {
Logger.getLogger(TextReader.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("Continue?[Y/N]");
}
}
Das problem mit dem code oben, das geschieht auch auf verschiedenen Methoden, die ich versuchte, ist, dass, wenn der Benutzer Arten Y, die Scanner
überspringen der ersten Eingabe für Vorname,und springen auf den Nachnamen. Wenn der Benutzer Arten N wird die Wiedergabe beendet, korrekt. Kann mir jemand erklären, warum dies geschieht, und wie Sie zu überwinden mit Scanner
Klasse?
p.s: etwas wie while(sc.nextLine().equals("Y"))
, wird die Schleife beendet, bevor die erste Eingabe vom Benutzer nach dem ersten Durchlauf der Schleife.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist, weil Sie mit
Scanner#next
Methode. Und wenn Sie sich die Dokumentation an, dass die Methode gibt das nächste token gelesen.Also, wenn Sie Lesen Benutzereingaben über
next
Methode, die es Lesen nicht dienewline
am Ende. Die ist dann zu LesennextLine()
innerhalb derwhile
Schleife. Und somit IhrefirstName
enthält einenewline
ohne dass Sie wissen.Also sollten Sie
nextLine()
in Ihr, während Sie eher alsnext()
.Ähnlich ist der Fall mit
nextInt
Methode. Es ist auch nicht zu Lesen, der Zeilenumbruch. So können Sieread
mitreadLine
und konvertieren Sie es inint
mitInteger.parseInt
. Es werfen kannNumberFormatException
wenn der input-Wert nicht konvertiert werden kann, umint
. So müssen Sie behandeln es entsprechend.Können Sie versuchen, den folgenden code: -
Aber beachten Sie eins, wenn Sie einen Wert eingeben, der Umgerechnet werden kann, um
Integer.parseInt
Sie erhalten eine Ausnahme, und diese Eingabe kann übersprungen werden. Für diesen Fall ist, müssen Sie behandeln es mitwhile
Schleife.Oder, wenn Sie nicht wollen, zu tun, dass exception-handling: -
Können Sie eine
empty sc.nextLine()
nachsc.nextInt()
, dass verbrauchen wird dienewline
übrig, wie diese: -nextInt
, er sagt das, liest es dienext
integer-token, so verlässt das newline, dass auch der Teil der Eingabe.newline
gelesen werden, wenn Sie das nächste mal aufrufennextLine
und damit Teil der Lektüre wird übersprungen.nextLine()
und Lesen Sie Ihre post 😛documentation
zu betrachten. Sie sagen, was tatsächlich, dass das Verfahren zu tun.newline
. Es nur liest nächsten token. Sie könnensc.nextLine
statt. Ich werde um meine post.equalsIgnoreCase(..)
zu verhindern, dass der Fall von Y oder N kleingeschrieben und Umgekehrt.sc.next()
ehersc.nextLine()
zu erreichen, was Sie wollen, weilnext()
liest nur bis zum nächsten Raum, währendnextLine()
liest bis zum nächsten\n
brechen.nextInt()
alle Daten Lesen alsString
und dann konvertieren, weilnextInt()
ist wienext()
so ist Lesen nicht bis zum nächsten \n.Versuchen Sie es so:
Enter number 21 Continue?
Sie nicht auch, dass in yourquestions snippet ganze etwas code, sonst kann ein Fehler beinextInt
liest nächsten token und nicht bis zum nächsten newlineKönnten Sie
Aufhören sollte das Programm bei Eingabe
Müssen Sie auch importieren und erstellen Sie den Scanner wie diesem: