Question

I have this code, and everything is running as i want to except the face that it skips the first time it is supposed to wait for the next input by the user. Here is the code:

import java.util.Scanner;
public class mainThread {
    public static int size;
    public static int counter;
    public static Scanner input = new Scanner(System.in);
    public static String currentIn;
    public static void main(String[] args){
        System.out.println("Please type the desired amount of players: ");
        size = input.nextInt();
        String nameArray[] = new String[size];
        for(int counter = 0; counter < size; counter++){
            System.out.println("Please enter the name of player " + (counter+1));
            currentIn = input.nextLine();
            nameArray[counter] = currentIn;
            System.out.println(nameArray[counter]);
        }
    }
}

Here is what the console says:

Please type the desired amount of players: 
3
Please enter the name of player 1

Please enter the name of player 2
Jacob
Jacob
Please enter the name of player 3

It completely skips the first loop, and i can't seem to figure out why. Thanks for your time!

Was it helpful?

Solution 3

I'm not sure what the problem is, but if you replace the line

currentIn = input.nextLine();

With:

currentIn = input.next();

It will work.

OTHER TIPS

nextInt() reads just the "3", but not the line break part. It's basically just reading up to the first token separator, but not consuming that. So if you typed in

3 Foo

and then hit return, it would take " Foo" as the name of the first player.

It sounds like you probably want to use nextLine() when finding the number of players, too:

String playerCountText = input.readLine();
size = Integer.parseInt(playerCountText); // Or use a NumberFormat

Personally I've always found Scanner to be a bit annoying like this - it sort of promises to make everything simple, but you really need to work out everything it's going to do...

Modified the program as so:

import java.util.Scanner;
public class mainThread {
    public static int size;
    public static int counter;
    public static Scanner input = new Scanner(System.in);
    public static String currentIn;
    public static void main(String[] args){
        System.out.println("Please type the desired amount of players: ");
        size = Integer.parseInt(input.nextLine().trim());
        String nameArray[] = new String[size];
        for(int counter = 0; counter < size; counter++){
            System.out.println("Please enter the name of player " + (counter+1));
            currentIn = input.nextLine();
            nameArray[counter] = currentIn;
            System.out.println(nameArray[counter]);
        }
    }
}

The problem was that the \n remained in the buffer and that is why the .nextLine() was skipped..

Edit, the following program also has some input validation done :

import java.util.Scanner;
public class mainThread {
    public static int size;
    public static int counter;
    public static Scanner input = new Scanner(System.in);
    public static String currentIn;
    public static void main(String[] args){
        boolean valid = false;
        System.out.println("Please type the desired amount of players: ");
        while(valid == false){
         try{
           size = Integer.parseInt(input.nextLine().trim());
           valid = true;
         }catch(Exception e){
            System.out.println("Error input, try again");
         }
        }
        String nameArray[] = new String[size];
        for(int counter = 0; counter < size; counter++){
            System.out.println("Please enter the name of player " + (counter+1));
            currentIn = input.nextLine();
            nameArray[counter] = currentIn;
            System.out.println(nameArray[counter]);
        }
    }
}

basically thing is when you give the input 3 and then press enter , the enter counted as a new line value which stay in the buffer and when you try to read a new line inside the loop

currentIn = input.nextLine();

for the first time it take that stored new line as an input . you can avoid this by adding currentIn = input.nextLine(); after size = input.nextInt();

or reading the input from a file.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top