Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is line 17 of this Java program not being executed?

Tags:

java

debugging

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.

like image 542
Auguste Avatar asked Mar 10 '10 07:03

Auguste


1 Answers

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.

like image 55
a_m0d Avatar answered Sep 21 '22 02:09

a_m0d