Ich habe ein Problem mit Scanner # nextLine. Nach meinem Verständnis sollte nextLine() den Rest des aktuellen Eingabestroms zurückgeben und dann zur nächsten Zeile weitergehen.Scanner # nextLine() hinterlässt ein übrig gebliebenes Newline-Zeichen
while (true){
try{
System.out.println("Please enter a month in numeric form");
month = input.nextInt();
System.out.println("Please enter a day in numeric form");
day = input.nextInt();
System.out.println("Please enter a two-digit year");
if (input.hasNextInt() == true){
year = input.next();
}
else{
throw new java.util.InputMismatchException();
}
break;
}
catch(Exception e){
System.err.println(e);
System.out.println("\nOne of your inputs was not valid.");
System.out.println(input.nextLine());
}
}
Das Problem ist die letzte Zeile. Wenn ich es als input.nextLine() belasse, akzeptiert die nächste Iteration der Schleife ein Newline-Zeichen für den Monat. Warum das? Sollte der Aufruf von nextLine im catch-Block den Rest der Zeile (einschließlich der Zeilenumbruch) nicht konsumieren und den Benutzer in der nächsten Iteration korrekt auffordern? Hinweis: Ich habe beschlossen, sie auszudrucken, um herauszufinden, was passiert, aber keine Zigarre.
ich eine Ausgabe vom Terminal gesammelt haben zu veranschaulichen, was ich meine:
// What should happen (this is when catch contains input.next() rather than nextLine)
/*
Please enter a month in numeric form
8
Please enter a day in numeric form
2
Please enter a two-digit year
badinput
java.util.InputMismatchException
One of your inputs was not valid.
badinput
Please enter a month in numeric form <------------- prompts for input, as expected
*/
// What happens when I have nextLine in the catch block (code above)
/*
Please enter a month in numeric form
8
Please enter a day in numeric form
2
Please enter a two-digit year
badinput
java.util.InputMismatchException
One of your inputs was not valid.
<------------ leftover newline printed, as expected
Please enter a month in numeric form <---------------- does not prompt for input due to another leftover newline (why?)
java.util.InputMismatchException
One of your inputs was not valid.
badinput <----------------------- prints badinput even though it should've been consumed on the last iteration (why?)
Please enter a month in numeric form
*/
Bevor jemand markiert diese als Duplikat, haben Sie bitte Verständnis, dass ich auf die Unterschiede zwischen den nächsten und nextline auf Stackoverflow haben gesucht bereits. nextLine sollte den Newline-Charakter konsumieren, scheint dies aber nicht zu tun. Vielen Dank.
'if (input.hasNextInt() == true) {' ist das gleiche wie 'if (input.hasNextInt()) {'. Warum mit wahr vergleichen? – Andreas