As an exercise for my Java course in Uni this morning, I had to write a small program to ask the user to input some details, then print them back. I've since finished writing it, but I ran into a strange problem along the way.
See the code below:
import java.util.Scanner;
public class Scanner_Exercise
{
public static void main (String[] args)
{
Scanner keyboardIn = new Scanner(System.in);
int accountId;
String accountName;
float accountBalance;
System.out.println("Account ID: "); //Line 13
accountId = keyboardIn.nextInt(); //Line 14
System.out.println("Account name: "); //Line 16
accountName = keyboardIn.nextLine(); //Line 17
System.out.println("Account balance: ");
accountBalance = keyboardIn.nextFloat();
}
}
When this program runs, line 17 (refer to comments) is skipped; Account name:
is printed, but the user is not given the opportunity to enter the information, as if that line of code was commented out. No errors are thrown. The output looks like this:
Account ID:
2
Account name:
Account balance:
However, if I switch lines 13 and 14 with 16 and 17, like as follows, the program runs fine, and no lines are skipped.
System.out.println("Account name: "); //Line 16
accountName = keyboardIn.nextLine(); //Line 17
System.out.println("Account ID: "); //Line 13
accountId = keyboardIn.nextInt(); //Line 14
Why is the line 17 being skipped in the first case, but not the second?
If it's somehow relevant, I am using JDK 6 Update 18, and TextPad 5.3.1.
A look at the javadoc should show you why.
Scanner.nextLine()
skips to the end of the current line, and returns whatever it skipped. Since the user has already input some data, this function will return what ever is left in the input stream. When you switch the order around, it doesn't yet have any input, which is why you see it ask for input.
The important part:
This method returns the rest of the current line, excluding any line separator at the end.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With