Java: проверка содержимого переменной char с условием if - PullRequest
0 голосов
/ 13 февраля 2010

У меня есть переменная char, которая должна содержать символы Y, y, n или N, я хочу проверить, не содержит ли она ее, затем отобразить сообщение об ошибке и выйти из программы.

Это код, который я использую;

    if (userDecision != 'Y' || userDecision != 'y' || userDecision != 'n' || userDecision != 'N')
        {
            System.out.println("Error: invalid input entered for the interstate question");
            System.exit(0);
        }

Независимо от того, что находится в переменной, она всегда возвращает true и выполняет команду для выхода из программы, что я делаю неправильно?

Ответы [ 5 ]

3 голосов
/ 13 февраля 2010

|| означает логическое или. Вы хотите && вместо.

if (userDecision != 'Y' && userDecision != 'y' ...

a || b возвращает значение true, если либо a , либо b соответствует true. Предположим, что userDecision равно 'Y'. Тогда

  • userDecision != 'Y' неверно
  • userDecision != 'y' верно
  • userDecision != 'N' верно
  • userDecision != 'n' верно

Таким образом, вместе условие выполняется и ветвь if выполняется.

OTOH, a && b возвращает true, если оба a и b верны, что вам действительно нужно.

2 голосов
/ 13 февраля 2010

Ваше условие "если это не a или не b", это означает, что оно всегда будет истинным, даже если это a или b. То, что вы хотите проверить это «если это не (а или б)» так:

if (! (userDecision == 'Y' || userDecision == 'y' || userDecision == 'n' || userDecision == 'N')) {
    System.out.println("Error: invalid input entered for the interstate question");
    System.exit(0);
}

Если ваш код содержит такие условия, которые становятся такими же длинными, как и многие альтернативные символы, для которых необходимо протестировать, вы можете использовать конструкцию switch, которая облегчает выполнение этого случая:

switch (userDecision) {
case 'y': /*fallthrough*/
case 'Y':
    // accepted
    break;
case 'n': /*fallthrough*/
case 'N':
    // rejected
    break;

default:
    System.out.println("Error: invalid input entered for the interstate question");
    System.exit(0);
}
2 голосов
/ 13 февраля 2010

Измените свои OR на AND

Или вы можете использовать

(!(userDecision == 'Y' || userDecision == 'y' || userDecision == 'n' || userDecision == 'N'))

Это

!(A OR B) 

равно

!A AND !B

Взгляните на Булева алгебра

Теорема де Моргана

NOT (P OR Q) = (NOT P) AND (NOT Q) 
NOT (P AND Q) = (NOT P) OR (NOT Q) 

Теорема Деморгана

2 голосов
/ 13 февраля 2010

Прочитайте вслух первую часть условия: отличается ли выбор от Y или y? Проблема в том, что любой символ отличается от Y или y. Вы выбрали неверный логический оператор - если вы хотите быть уверены, что пользователь выбрал что-то другое, кроме этих символов в условии, вы должны выбрать &&, логический и: Отличается ли символ от Y и также отличается от y и и т. Д.

1 голос
/ 13 февраля 2010

Вам нужно использовать && вместо ||. Вы спрашиваете, совпадает ли «ни один» из этих символов, а не просто совпадает ли один из четырех. (Значение не может быть одновременно Y, y, N и n.)

...