I am using the Scanner
methods nextInt()
and nextLine()
for reading input.
It looks like this:
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)
The problem is that after entering the numerical value, the first input.nextLine()
is skipped and the second input.nextLine()
is executed, so that my output looks like this:
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
I tested my application and it looks like the problem lies in using input.nextInt()
. If I delete it, then both string1 = input.nextLine()
and string2 = input.nextLine()
are executed as I want them to be.
That's because the Scanner.nextInt
method does not read the newline character in your input created by hitting "Enter," and so the call to Scanner.nextLine
returns after reading that newline.
You will encounter the similar behaviour when you use Scanner.nextLine
after Scanner.next()
or any Scanner.nextFoo
method (except nextLine
itself).
Workaround:
Either put a Scanner.nextLine
call after each Scanner.nextInt
or Scanner.nextFoo
to consume rest of that line including newline
int option = input.nextInt();
input.nextLine(); // Consume newline left-over
String str1 = input.nextLine();
Or, even better, read the input through Scanner.nextLine
and convert your input to the proper format you need. For example, you may convert to an integer using Integer.parseInt(String)
method.
int option = 0;
try {
option = Integer.parseInt(input.nextLine());
} catch (NumberFormatException e) {
e.printStackTrace();
}
String str1 = input.nextLine();
@blekione. You have to use
try-catch
, becauseInteger.parseInt
throwsNumberFormatException
when an invalid argument is passed to it. You will learn about exception later on. For E.G: -Integer.parseInt("abc")
. You don't want "abc" to get converted to int right?@blekione. So, in the above case, your code will halt at that point, and you won't be able to continue the execution. With Exception Handling, you can handle such kind of conditions.
To which extent is the latter better? AFAIK Scanner#nextInt() is way more lenient in finding correct ints, by allowing group commas and locale prefixes and suffixes. Integer#parseInt() allows digits and decimal point only plus an optional sign.
I personally prefer a
Scanner#hasNextFoo
check beforehand instead of a try-catch, but that works too.Use ParseDouble has a new problem, that nextDouble use the regional configuration of decimal (. or ,) but Parsedouble always receive US decimal ( . ).