文本验证失败

时间:2014-02-06 15:07:41

标签: java loops

我有一段代码,一直给我一个错误:

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);

我添加了“For testing”块只是为了看看,如果由于某种原因,变量角色发生了某些事情,但事实并非如此。无论我如何编写manager / developer / qa(无论是大写字母,小写字母等),都会触发“无效角色”并重新循环。

有什么建议吗?

4 个答案:

答案 0 :(得分:1)

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

不是您想要的,请将||替换为&&

在您的代码中,您说:role不是“经纪人”或role不是“开发者”或role不是“QA”。

由于Short-circuit evaluation,如果第一个条件为true,则不会评估其他条件,因为true || anything始终为true

答案 1 :(得分:1)

逻辑上,这个测试是错误的

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

为什么呢?因为如果role =“MANAGER”,它不等于“DEVELOPER”(或“QA”),反之亦然。我想你想要

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

答案 2 :(得分:0)

Java如果测试布尔表达式的短路。

||更改为&&

答案 3 :(得分: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语句很难出错并记录下来:

if (!validRole(role)) {
   //...
}