문제

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!

도움이 되었습니까?

해결책 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.

다른 팁

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.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top