Java для пропусков цикла запускается дважды - PullRequest
3 голосов
/ 22 ноября 2011

Мой код, кажется, повторяет цикл 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;
}

}

1 Ответ

4 голосов
/ 23 ноября 2011

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

например,

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.

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

...