刚刚在此代码中发现了一个错误:
for(String link : tempList1){
if(!tempList2.contains(link));{
listToPopulate.add(link);
}
}
';'在if(!tempList2.contains(link))结束时导致条件计算为true,即使它应该为false。为什么会这样?
修复就是删除';'
答案 0 :(得分:13)
编译器看到if
条件后跟一个独立块。使用标准缩进,它看起来像这样:
for(String link : tempList1){
if(!tempList2.contains(link))
; // ; is a no-op statement.
{
listToPopulate.add(link);
}
}
http://en.wikipedia.org/wiki/NOP#NOP_code
C中表现得像NOP的最简单的语句就是所谓的null语句,它只是需要语句的上下文中的分号。
Java从C继承了这种语法。
答案 1 :(得分:5)
第2行中的;
结束if
之后的块。下一个{
打开一个没有条件的新块。
答案 2 :(得分:3)
if(expr);
{
dosomething();
}
与
相同if(expr)
{
}
{
dosomething();
}
e.g。包含dosomething的块不是if语句的一部分,因为;终止if语句。
if语句没有评估为true,它只是不相关。
答案 3 :(得分:1)
正如其他人所说,
if([condition]);
somecode;
类似于
if([condition])
{}
somecode
如果您使用的是Eclipse,则可以启用“空语句”警告。这样可以让你在编写这样一个空语句时很容易看到,因为这通常是无意识的,并且可能会令调试烦人。它位于Eclipse首选项中(Java>编译器>错误/警告)。
答案 4 :(得分:0)
由于;
导致if
条件的结束,导致if
语句本身无效。
以上相当于:
for(String link : tempList1){
if(!tempList2.contains(link)) {
// do nothing
}
// the below is just an empty block, it will be executed always.
{
listToPopulate.add(link);
}
}
答案 5 :(得分:0)
对条件的评估不会改变。然而,改变的是,以下行不再是在循环中并且无条件地执行:
listToPopulate.add(link);
换句话说,代码等同于:
for(String link : tempList1){
if(!tempList2.contains(link)) {
}
listToPopulate.add(link);
}
答案 6 :(得分:0)
分号指定语句的结尾,{}表示新的代码块。因此,由于存在分号,因此评估并忽略该条件。始终执行listToPopulate.add(link);
,因为它与之前的if语句无关。