Java 第一个if语句总是正确的,但第二个if语句不是
如果以前有人问过我这个问题,我很抱歉 这是我的一些代码Java 第一个if语句总是正确的,但第二个if语句不是,java,Java,如果以前有人问过我这个问题,我很抱歉 这是我的一些代码 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 mo
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;
}
}
如你所见。除变量外,两条if/else语句完全相同。在IntelliJ中,ID的第一个语句表示它总是正确的。第二条语句是密码,它没有给我这个警告
如果第二个if/else语句完全相同(减去变量),并且不总是真的,那么第一个if/else语句怎么可能总是真的
(扫描仪在此代码之前声明。)由于您的
id1
和id2
不相等,表达式(id!=id1 | id!=id2)
应始终计算为true。您可能希望使用&&
替换|
。然后您的代码进入第一个循环,导致第二个表达式未计算,因此没有警告。您的逻辑已关闭,if
语句应将两个相等检查合并在一起:
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或q)
变成NOT p和NOT q
编辑:第二个循环从未被命中的原因很简单,因为第一个循环永远无法退出。但这里重要的是理解德摩根定律。这种类型的错误在这里经常出现。问题与您对
|
(或)的使用有关。程序逻辑看到的是,“如果id不等于id1或的值,则id不等于id2,则此语句为真。”
由于您不能同时拥有一个等于这两个数字的ID,因此它的计算结果将始终为true
-编辑-
您的IDE足够聪明,能够识别这一点,并且将看到您永远无法退出第一个while循环。这意味着你永远不会得到第二个if语句,它也永远不会进行任何正面或负面的评估
要解决此问题,请改用&&运算符查看它们是否不等于任何一个ID
此外,任一ID都将与任一密码一起使用,因为没有与ID密码匹配的ID如果,IntelliJ不会告诉您第二个
的任何信息的原因是,它检测到您在
时无法输入第二个
事实上,打破第一个while
的唯一方法是有一个异常,即使如此,您也不会在while
时输入第二个
因此,IntelliJ无需检查第二个while
内发生的任何事情,因为第一个if始终为真,if部分没有中断,而循环永远不会结束。所以这可能就是第二个没有显示警告的原因
尝试对第一个while部分进行注释,看看第二个部分是否显示警告
另外,在两个while循环之间,您的代码有一个bug,您应该使用input.nextLine()
,因为当您输入第一个输入并按enter键时,第一个input.nextLine()
将使用int而不是新行,if将传递给第二个input.nextLine()
。因此,要使用新行,请在两个nextLine()之间插入input.nextLine()
,因为您使用的是逻辑OR运算符,所以只有一个真值足以执行IF块。您的id可以是id1、id2或其他。如果id=id1,左侧为FALSE,右侧为TRUE。如果id=id2,左侧为真,右侧为假。如果id是其他东西,那么双方都是真的。在每一种情况下,条件检查最终都是真的。因此,如果block始终为TRUE。您必须按如下方式修改它
if(id == id1 || id == id2){
break;
} else {
System.out.println("Employee does not exist. Please try again.");
}
或
的确
身份证!=id1 | | id!=id2
将永远不会为false,因为id1和id2值不同,如果id==id1,则id不能等于id2,所以在这种情况下,条件将为true
如果您修复了该警告,则intellij将在下一个while循环If条件中向您显示警告,并且同样的情况也适用于(idPass!=idPass1 | | idPass!=idPass2)条件。基于您的静态代码,您的真值表中只能有这种情况,并且它们被解析为true:
x y z | x != y | x != z | v
---------------------------
0 0 1 | 0 | 1 | 1
0 1 0 | 1 | 0 | 1
1 0 1 | 1 | 0 | 1
1 1 0 | 0 | 1 | 1
如果你第一次评论会发生什么?这可能只是IntelliJ中的一个bug。两者都是正确的。不确定,但也许你只得到了触发它的第一次事件的信息。修复第一个语句并检查是否在第二个语句中得到它如果通过实验交换两个while块会发生什么?它可能会检测到第一个如果始终为true
,那么while
将永远不会被跳过,那么您将永远不会到达第二个如果
,因此它是否始终为true并不重要true
或不假设您获得id
的输入1234
,if
将通过,因为1234!=5678
。如果取而代之的是输入5678
,它将通过,因为5678!=1234
。如果你得到任何其他的东西,它仍然会通过前面的原因。分析可能会在第一个实例停止,但第二个(如果
)会表现为same@Yunnosch,这同样适用于第二个条件,您的意思是不是(id==id1 | | id==id2)
@NicholasK no,它不会。您无法访问第二个if
,因此它不可能总是正确的。我编辑了我的答案,但是如果您将第一个if语句更改为&&
,并将第二个if语句保留为|
,您将看到警告现在显示在第二个if语句上。您的IDE足够聪明,能够识别这一点,并且将看到您永远无法退出第一个while循环。这意味着你永远不会到达第二个if语句,它将
x y z | x != y | x != z | v
---------------------------
0 0 1 | 0 | 1 | 1
0 1 0 | 1 | 0 | 1
1 0 1 | 1 | 0 | 1
1 1 0 | 0 | 1 | 1