2013-03-24 5 views
1

У меня есть этот код, и все работает, поскольку я хочу, кроме того, что он пропускает первый раз, когда он должен ждать следующего входа пользователя. Вот код:for loop skip issue

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]); 
     } 
    } 
} 

Вот что консоль говорит:

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 

Он полностью пропускает первый цикл, и я не могу понять, почему. Спасибо за ваше время!

+0

'nextInt()' только считывает значение in, а не остальную часть строки. Вы можете добавить 'input.nextLine();', чтобы игнорировать остальную часть строки. –

ответ

0

Я не уверен, что проблема, но если вы замените строку

currentIn = input.nextLine(); 

с:

currentIn = input.next(); 

Будет работать.

+0

ok Thak вам это помогло! –

+0

За исключением того, что это означает, что имена игроков не могут содержать пробелы, что для меня не идеально. –

1

nextInt() читает только «3», но не часть разрыва строки. Это в основном просто чтение до первого разделителя маркеров, но не потребление этого. Так что, если вы ввели в

3 Foo 

и затем хит возвращение, он будет считать «Foo» в качестве имени первого игрока.

Это звучит, как вы, вероятно, хотите использовать nextLine() при нахождении числа игроков, тоже:

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

Лично я всегда находил Scanner быть немного раздражает, как это - это своего рода обещает сделать все просто, но на самом деле нужно работать все это собирается сделать ...

+0

Хорошо, спасибо спасибо! –

+0

Jon, без 'input.readLine().trim() '- любой неправильный ввод, такой как' 3 'приведет к ошибке NumberFormatException –

+0

@Aniket: Конечно, вам нужно либо обрезать, либо сочтет это недопустимым. Всегда будет существовать возможность ввода пользователем чего-то недействительного - либо потому, что он не является числовым, либо потому, что он отрицательный. –

1

Модифицированный программу как так:

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]); 
     } 
    } 
} 

Проблема заключалась в том, что \n оставался в буфере, и именно поэтому .nextLine() был пропущен ..

Редактировать, следующая программа также некоторые проверки входных данных сделано:

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]); 
     } 
    } 
} 
0

в основном то, когда вы даете вход 3, а затем нажмите клавишу ВВОД, ВВЕСТИ считается новое значение строки, которые остаются в буфере и при попытке прочитать новую строку внутри цикла

currentIn = входной .nextLine();

В первый раз это займет сохраненную новую строку в качестве входа. вы можете избежать этого, добавив currentIn = input.nextLine(); после размер = input.nextInt();

или чтение ввода из файла.