Почему жесткое кодирование чисел работает, а использование переменных с одинаковыми значениями — нет?

Я пишу программу, представляющую собой игру, в которой вы должны угадать любое случайное 4-значное целое число, которое сгенерирует компьютер. У меня возникли проблемы с проверкой ввода, а точнее, с моим методом isDigit(), цель которого убедиться, что все входные данные от userGuess являются цифрами от 0 до 9:

          private static boolean isDigit(char indexPos) { // verifies if the input char is a digit 0-9 or not
        if(indexPos == 0 || indexPos == 1 || indexPos == 2 || indexPos == 3 || indexPos == 4 || indexPos == 5 || indexPos == 6 || indexPos == 7 || indexPos == 8 || indexPos == 9) {
            return true;
        }
        else {
            return false;
        }
    }

Если я жестко запрограммирую такие вещи, как

      isDigit(1)

он оценивается как истина, но если я подставляю переменные, он возвращает ложь. В основном это возвращает false, даже если все позиции индекса userGuess являются цифрами 0-9:

      isDigit(userGuess.charAt(i)) // returns false even when index pos i is [0-9]

Я совершенно смущен и озадачен тем, почему это происходит. Для контекста, вот вся ситуация цикла if и for для проверки:

      numGuess++;
System.out.print("Guess " + numGuess + ": ");
userGuess = kbd.nextLine();
System.out.println("DEBUG: userGuess.length() : " + userGuess.length());

// validate that the input is a valid input (a 4 digit natural number, incl 0000)
if(userGuess.length() < 4 || userGuess.length() >= 5){
   System.out.println("Please enter a valid input, which is a 4 digit natural number (postive integer, including 0000).");
}
else if(userGuess.length() == 4) {
   for(int i = 0;  i <= 3; i++) {
     if(isDigit(userGuess.charAt(i)) == true) { 
        validateCount++;
     }
}

У меня также есть, как я полагаю, та же проблема, при проверке, если userGuess.length() == 4. Если я вывожу userGuess.legnth() на консоль, он предоставляет правильный номер, а когда == 4, это если цикл не выполняется, даже если условие выполнено:

      if (userGuess.length() < 4 || userGuess.length() >= 5) {
   System.out.println("Please enter a valid input, which is a 4 digit natural number (postive integer, including 0000).");
} else if (userGuess.length() == 4) { // avoid out of bounds errors for inputs less than 4 digits
   for (int i = 0; i <= 3; i++) { // userGuess will never have an index above 3, as it is a 4 digit number
if (isDigit(userGuess.charAt(i)) == true && userGuess.length() == 4) { // verify that the userInput is a 4 digit integer
    validateCount++;
}

2 ответа

Если вы действительно работаете с персонажами, то вы можете сделать это.

      private static boolean isDigit(char indexPos) { 
    return Character.isDigit(indexPos);
}

Но тогда вам действительно не нужен новый метод. В любом случае я бы посоветовал вам работать с реальными intsкак имя аргумента indexPosпредполагает.

Вы сравниваете char indexPos с целыми числами от 0 до 9. Попробуйте сравнить indexPos с «0», «1», «2»,... Таким образом, вы сравнили char indexPos с другим char.

Другие вопросы по тегам