【问题标题】:What am I doing wrong with my Java code for input validation? [duplicate]我对输入验证的 Java 代码做错了什么? [复制]
【发布时间】:2016-03-04 11:55:50
【问题描述】:

所以这个程序应该是一个游戏,用户输入一个短语,另一个用户尝试猜测这个短语。但是,我在购买元音时遇到了问题。无论我在第 41 行输入什么 (,它都会通过循环。我创建了 validAnswer(String answer) 方法,希望它在循环中有用,但它看起来没有多大帮助。我知道我遗漏了一件小事,但我对 Java 还太陌生,无法识别它。我做错了什么?

对于代码量过长,我深表歉意。

import java.util.Scanner;

public class PhraseGame {

public static void main(String[] args) {

    // Initialize scanner
    Scanner stdIn = new Scanner(System.in);

    // Initialize variables
    String sPhrase;
    String answer = "f";
    char cGuess = 0;
    char vGuess = 0;
    int count = 0;
    int vowels = 0;
    int consonants = 0;
    int spaces = 0;
    boolean gameOver = false;
    boolean correct = true;

    // Start the "fun" game
    System.out.print("Please enter the phrase to guess at: ");
    sPhrase = stdIn.nextLine();

    // Create the temporary Array
    char [] tmpArr = new char[sPhrase.length()];
    for (int i = 0; i < sPhrase.length(); i++) {
        tmpArr[i] = sPhrase.charAt(i);
    }

    // Gets the number of spaces
    spaces = initTemplateArray(sPhrase, tmpArr, spaces);
    printTemplateArray(tmpArr);

    while (!(endGame(gameOver, spaces, consonants, vowels, sPhrase))) {
        cGuess = getConsonant(stdIn, cGuess);

        do {
            System.out.print("\nWould you like to buy a vowel?: ");
            answer = stdIn.next();

            if (answer == "y") {
                getVowel(stdIn, vGuess); }

            else if (answer == "n"){
                break;
            }
        } while (!validAnswer(answer));


        // Updates the array and prints it
        updateTemplateArray(tmpArr, sPhrase, cGuess, vGuess, count, vowels, consonants);
        printTemplateArray(tmpArr);

        // Checks if the game is over
        endGame(gameOver, spaces, consonants, vowels, sPhrase);
    }

}


// returns the number of space characters used in the common phrase
public static int initTemplateArray(String sPhrase, char [] tmpArr, int spaces) {
    for (int i = 0; i < sPhrase.length(); i++) {
        if (tmpArr[i] != ' ') {
            tmpArr[i] = '?';
        } else {
            tmpArr[i] = ' ';
            spaces++;
        }
    }

    return spaces;
}



public static void printTemplateArray(char [] tmpArr) {
    System.out.println("\nCommon Phrase");
    System.out.println("-------------");
    for (int i = 0; i < tmpArr.length; i++) {
        System.out.print(tmpArr[i]);
    }
}

public static boolean isVowel(char c) {
    return (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u');
}

public static char getConsonant(Scanner stdIn, char cGuess) {
    do {
        System.out.println("\nEnter a lowercase consonant guess: ");
        cGuess = stdIn.next().charAt(0);
    } while (isVowel(cGuess));

    return cGuess;
}

public static char getVowel(Scanner stdIn, char vGuess) {
    do {
        System.out.println("\nEnter a lowercase vowel guess: ");
        vGuess = stdIn.next().charAt(0);
    } while (!(isVowel(vGuess)));

    return vGuess;
}

public static int updateTemplateArray(char [] tmpArr, String sPhrase, char cGuess, char vGuess, int count, int vowels, int consonants) {
    for (int i = 0; i < sPhrase.length(); i++) {
        if (cGuess == sPhrase.charAt(i)) {
            tmpArr[i] = sPhrase.charAt(i);
            count++;
            consonants++;
        }

        if (vGuess == sPhrase.charAt(i)) {
            tmpArr[i] = sPhrase.charAt(i);
            count++;
            vowels++;
        }
    }

    return count & vowels & consonants;
}

public static boolean endGame(boolean gameOver, int spaces, int consonants, int vowels, String sPhrase) {
    int total = spaces + consonants + vowels;

    if (total == sPhrase.length()) {
        return true;
    }

    else {
        return false;
    }
}

public static boolean validAnswer(String answer) {
    if (answer.equalsIgnoreCase("y")) {
        return true;
    }

    else if (answer.equalsIgnoreCase("n")) {
        return true;
    }

    else {
        return false;
    }

}

}

【问题讨论】:

    标签: java arrays string validation input


    【解决方案1】:

    您需要检查是否为空。

    public static boolean validAnswer(String answer) {
        if (answer!=null && (answer.equalsIgnoreCase("y") || answer.equalsIgnoreCase("n"))) {
            return true;
        }
        return false;
    }
    

    或其他非常规的方式。

    public static boolean validAnswer(String answer) {
        if ("y".equalsIgnoreCase(answer) || "n".equalsIgnoreCase(answer))) {
            return true;
        }
        return false;
    }
    

    你需要修复

    do {
        System.out.print("\nWould you like to buy a vowel?: ");
        answer = stdIn.nextLine();
    
        if ("y".equalsIgnoreCase(answer)) {
            getVowel(stdIn, vGuess); 
        } else if ("n".equalsIgnoreCase(answer)){
            break;
        }
    } while (!validAnswer(answer));
    

    【讨论】:

    • 效果很好,非常感谢。但是,“Would you like to buy a vowel”会打印两次。
    • 你看到了吗 answer = stdIn.nextLine();改变?
    • 我做到了,但这并没有改变任何事情。我在调试器中逐行运行它,答案是 = stdIn.nextLine();无需等待输入的语句。
    • 不吹就是等你输入。
    • 直到我切换到 answer = stdIn.next();
    猜你喜欢
    • 1970-01-01
    • 2012-10-31
    • 2014-03-28
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多