Java for loop skips запускается дважды

Мой код дважды повторяет цикл for, прежде чем дать мне возможность ответить. Я пялился на это весь день и почти уверен, что не замечаю ошибок, которые совершил. Некоторая помощь будет высоко оценена.

Мне жаль, что норвежец застрял там, но это не имеет отношения к проблеме.

public static void verb(){
    System.out.print("Oppgi navn på verbfil: ");
    Scanner input = new Scanner(System.in);
    String fileName = input.nextLine();
    File textFile = new File(fileName);
    try{
        Scanner fileInput = new Scanner(textFile);
        System.out.print("\nVelkommen til programmet som tester deg i bøyning av engelske verb.\nDu kan velge opp til 88 verb å bli testet i.\nDu vil få en vurdering når testen er ferdig\n\n");
        System.out.print("Ønsker du å prøve dette? (ja/nei) ");
        String yesNo = input.next();
        if (yesNo.toLowerCase().equals("ja")){
            System.out.print("\nOppgi ønsket antall verb: ");
            int points = 0;
            int amountVerbs = input.nextInt();
            for (int i = 1; i <= amountVerbs; i++){
                String verb1 = fileInput.next();
                String verb2 = fileInput.next();
                String verb3 = fileInput.next();
                int verbSelect = randomGen(3);
                if (verbSelect == 1){
                    System.out.print("... " + verb2 + " - " + verb3);
                    System.out.print("\nSkriv inn formen som mangler: ");
                    String answer = input.nextLine();
                    if (answer.toLowerCase().equals(verb1)){
                        points+= 1;
                    }
                }
                if(verbSelect == 2){
                    System.out.print(verb1 + " - " + "..." + " - " + verb3);
                    System.out.print("\nSkriv inn formen som mangler: ");
                    String answer = input.nextLine();
                    if (answer.toLowerCase().equals(verb2)){
                        points+= 1;
                    }
                }
                if(verbSelect == 3){
                    System.out.print(verb1 + " - " + verb2 + " - " + "...");
                    System.out.print("\nSkriv inn formen som mangler: ");
                    String answer = input.nextLine();
                    if (answer.toLowerCase().equals(verb3)){
                        points+= 1;
                    }
                }
            }
            System.out.print("Oppgi navnet ditt: ");
            String name = input.nextLine();
            System.out.print(name + "\n" + "Score: " + points + " av " + amountVerbs);
        } else{
            System.out.print("Greit det.");
        }
    } catch (FileNotFoundException exc) {
        System.out.println("Feil filnavn!");
    }
}

public static int randomGen(int randMax){
    Random generator = new Random();
    int verbSelect = generator.nextInt(randMax) + 1;
    return verbSelect;
}

}

person Ceteareth    schedule 22.11.2011    source источник
comment
Что он должен делать?   -  person dann.dev    schedule 23.11.2011
comment
Вы имеете в виду, что он печатает Skriv inn formen som mangler: дважды, прежде чем разрешить какой-либо ввод?   -  person flesk    schedule 23.11.2011


Ответы (1)


Ваша проблема, вероятно, связана с использованием вами объекта Scanner и тем, как он обрабатывает токен End Of Line (EOL). Обратите внимание, что только Scanner#nextLine() обрабатывает этот токен, а next(), nextInt(), nextDouble() и им подобные — нет. Часто, если вы просите пользователей вводить число, имеет смысл вызывать nextLine() сразу после получения числового ввода.

e.g.,

Scanner input = new Scanner(System.in);
int myInt = input.nextInt();
input.nextLine(); // added to swallow the EOL token

Попробуйте изменить это:

String yesNo = input.next();

к этому

String yesNo = input.nextLine(); // handles EOL.

и это:

int amountVerbs = input.nextInt(); 

к этому:

int amountVerbs = input.nextInt();
input.nextLine(); // to swallow the EOL token.

и так далее для других целей использования Scanner.

person Hovercraft Full Of Eels    schedule 22.11.2011
comment
Хах, и он оказался одним из ваших! Эй, теперь я могу спросить вас, как вы относитесь к -› double d = Double.parseDouble(input.nextLine());, чтобы избежать пожирателей EOL? - person ChiefTwoPencils; 22.07.2014
comment
@ChiefTwoPencils: это будет работать нормально, если вы улавливаете исключение NumberFormatException. - person Hovercraft Full Of Eels; 22.07.2014