;在条件结束时导致意外行为

时间:2012-01-19 15:12:49

标签: java

刚刚在此代码中发现了一个错误:

    for(String link : tempList1){
        if(!tempList2.contains(link));{
            listToPopulate.add(link);
        }
    }

';'在if(!tempList2.contains(link))结束时导致条件计算为true,即使它应该为false。为什么会这样?

修复就是删除';'

7 个答案:

答案 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语句无关。