如果之前有人问过这个问题,我很谦虚地道歉。这是我拥有的一些代码。 int id1 = 1234; int id2 = 5678; int idPass1 = 123; int idPass2 = 456; System.out.println("Welcome. Please enter your Employee ID."); while(true) { int id = input.nextInt(); //add more if needed if(id != id1 || id != id2){ System.out.println("Employee does not exist. Please try again."); } else { break; } } System.out.println("Please enter your password."); while(true){ int idPass = input.nextInt(); //add more if needed if(idPass != idPass1 || idPass != idPass2){ System.out.println("Incorrect Password entered. Please try again."); } else { break; } }如你看到的。除了变量之外,2 个 if/else 语句完全相同。IntelliJ 中带有 ID 的第一个语句表示它总是正确的。带有密码的第二个语句没有给我那个警告。如果第二个 if/else 语句完全相同(减去变量)并且不总是正确的,那么第一个 if/else 语句如何始终为真?(扫描器是在此代码之前声明的。)
3 回答
猛跑小猪
TA贡献1858条经验 获得超8个赞
由于您的id1
和id2
不相等,因此表达式的计算结果(id != id1 || id != id2)
应始终为真。您可能想用&&
替换||
. 然后您的代码落在第一个循环中,导致未评估第二个表达式,因此没有警告。
达令说
TA贡献1821条经验 获得超6个赞
IntelliJ 之所以没有告诉您有关第二个的任何信息,if
是因为它检测到您永远无法进入第二个while
。
确实,突破第一个的唯一方法while
就是有一个例外,即使这样,你也不会进入第二个while
。
因此,IntelliJ 无需检查第二个内部发生的任何事情while
。
有只小跳蛙
TA贡献1824条经验 获得超8个赞
您的逻辑已关闭,并且该if语句应该将两个相等性检查AND放在一起:
if (id != id1 && id != id2) {
System.out.println("Employee does not exist. Please try again.");
}
您可以通过改写,你要这么长时间来块作为说服自己的这个id输入的不是要么id1或者id2,即
NOT (id = id1 || id = id2)
根据德摩根定律,NOT (p OR q)变为NOT p AND NOT q。
编辑:第二个循环永远不会被命中的原因是微不足道的,因为第一个循环永远不会退出。但这里重要的是理解德摩根定律。这种类型的错误在这里经常出现。
添加回答
举报
0/150
提交
取消