2014-02-06 2 views
0

У меня есть фрагмент кода, который последовательно дает мне ошибку:Failed текст проверки

do { 
    System.out.println("Choose Role: (Manager, Developer, QA) "); 
    role = scan.nextLine(); 
    // For testing:   /////////////////////// 
    System.out.println("role is: " + role); 
    //////////////////////////////////////////////// 
    if (is_numeric(role)) { 
     System.out.println("Invalid Input."); 
     continue; 
    } else if (!role.equalsIgnoreCase("MANAGER") || !role.equalsIgnoreCase("DEVELOPER") || !role.equalsIgnoreCase("QA")) { 
     System.out.println("Invalid Role"); 
     continue; 
    } else { 
     break; 
    } 
} while (true); 

Я добавил «Для тестирования» блок просто увидеть, если по какой-то причине есть что-то происходит с переменной роли , но его нет. Независимо от того, как я пишу менеджер/разработчик/qa (будь то в шапках, маленьких буквах и т. Д.), Запускается «Неверная роль», и цикл переходит снова.

Любые предложения?

+1

Можете ли вы показать мне какое-то значение 'a', что подведет test '(a! = 1 OR a! = 2)'? – Pshemo

+0

Несвязанный, но я бы переместил это в отдельный метод, чтобы облегчить думать о магистральном коде. Кроме того, использование строк для ролей просто больно - подумайте об использовании перечисления или, возможно, класса. –

ответ

1

Логически, этот тест является неправильным

(!role.equalsIgnoreCase("MANAGER") || 
!role.equalsIgnoreCase("DEVELOPER") || 
!role.equalsIgnoreCase("QA")) 

Почему? Потому что, если роль = «МЕНЕДЖЕР», она не равна «РАЗРАБОТЧИК» (или «ОК») и наоборот. Я думаю, что вы хотели

(!role.equalsIgnoreCase("MANAGER") && 
!role.equalsIgnoreCase("DEVELOPER") && 
!role.equalsIgnoreCase("QA")) 
+0

Спасибо, что сделал! Думаю, в моей голове было бы правильно сказать, если роль не равна менеджеру OR Developer OR qa, а затем выбросить ошибку. – xv47

1
!role.equalsIgnoreCase("MANAGER") || !role.equalsIgnoreCase("DEVELOPER") || 
       !role.equalsIgnoreCase("QA") 

Не то, что вы хотите, замените || с &&.

В своем коде вы говорите: Если role не «МЕНЕДЖЕР» ИЛИ если role не «РАЗРАБОТЧИК» ИЛИ если role не «ОК».

Благодаря Short-circuit evaluation, если первое условие true, остальные не будут оценены, потому что true || anything всегда true.

0

Java, если тестовое короткое замыкание для булевых выражений.

Изменение || в &&

0

Вопреки тому, что все остальные говорят, если то, что вы пытаетесь модели «не действует», то не распространять негатив по каждому условию и использовать &&. Это не правильное моделирование. Модель «действует», поставить скобки вокруг него и свести на нет всю вещь:

if (!(role.equalsIgnoreCase("MANAGER") || role.equalsIgnoreCase("DEVELOPER") || 
      role.equalsIgnoreCase("QA"))) { 
    //... 
} 

Но это тот случай, когда вспомогательный метод улучшит ясности кода в значительной степени. Первая модель, что вы хотите модель, а не обратное:

public boolean validRole(String role) { 
    return role.equalsIgnoreCase("MANAGER") || 
      role.equalsIgnoreCase("DEVELOPER") || 
      role.equalsIgnoreCase("QA"); 
} 

Тогда ваше заявление, если трудно получить неправильно и сам документы:

if (!validRole(role)) { 
    //... 
} 
Смежные вопросы