我有一段代码,一直给我一个错误:
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(无论是大写字母,小写字母等),都会触发“无效角色”并重新循环。
有什么建议吗?
答案 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)) {
//...
}