2012-01-19 21 views
2

の原因となった状態の終わりにちょうどこのコードにバグが見つかりました:;予期しない動作

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

「;」 if(!tempList2.contains(link))の最後には、falseでなければならないが、条件がtrueに評価されます。これはなぜ起こるのですか?

「;」を削除するだけです。

答えて

13

コンパイラは、ifの後にスタンドアロンブロックが続くことを確認します。 NOPのように振る舞うCで、できるだけ簡単な文がでちょうどセミコロンである、いわゆる空文、ある

for(String link : tempList1){ 
    if(!tempList2.contains(link)) 
     ; // ; is a no-op statement. 
    { 
     listToPopulate.add(link); 
    } 
} 

http://en.wikipedia.org/wiki/NOP#NOP_code

:標準インデントで、それはこのようになります。ステートメントが必要なコンテキスト

Javaは、ライン2における;if次のブロックを終了C.

5

からこの構文を継承。次の{は、そのまわりに条件がない新しいブロックを開きます。

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); 
    } 
} 
0

条件の評価が変わらない:

上記と同じです。変更を何、しかし、次の行は、もはや内部ループであると無条件に実行されることはありません:

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

セミコロンの指定:つまり

listToPopulate.add(link); 

、コードが等価になりますステートメントの最後と{}は新しいコードブロックを示します。したがって、条件は評価され、セミコロンがあるので無視されます。 listToPopulate.add(link);は、前のif文に結び付けられていないため、常に実行されます。

3
if(expr); 

{ 
    dosomething(); 
} 

if(expr) 
{ 
} 

{ 
    dosomething(); 
} 

例えば同じですdosomethingを含むブロックはif文の一部ではありません。 if文を終了します。

ifステートメントがtrueと評価されていないため、関連性がありません。Eclipseを使用している場合は

1

他の人が言ったように、

if([condition]); 
    somecode; 

if([condition]) 
    {} 
somecode 

に似ている、あなたは "空の声明" の警告を有効にすることができます。このような空文が書かれているときには、これは一般的に意図せずにデバッグするのが面倒なので、簡単に確認できます。 Eclipseの設定(Java>コンパイラ>エラー/警告)にあります。