2012-11-13 133 views
1

這是代碼片段:編譯器錯誤:「未聲明」

boolean nodesFiltered = false; 

filterSet = newNodeSet; 
int filterSize; 
int i; 

for (; predIter.hasNext(); i < filterSize) 
{ 
    eachPred = (Predicate)predIter.next(); 

    filterSize = filterSet.size(); 

    i = 0; continue; 

    contextNode = filterSet.get(i); 

    if (contextNode != null) 
    { 
    List list = new ArrayList(1); 

    list.add(contextNode); 

    predContext.setNodeSet(list); 

    predContext.setPosition(i + 1); 
    predContext.setSize(filterSize); 

    predResult = eachPred.evaluate(predContext); 

凡說i < filterSize)編譯器說,我有一個錯誤...它說,它不是一份聲明中...

+0

將程序縮小到可以重現相同錯誤的最小尺寸。你很可能會自己想出來,但如果你不能再問這裏 –

回答

2

事實上,這條線是不正確的:

for (; predIter.hasNext(); i < filterSize) 

在Java (和所有其他C-語法語言)for statement具有以下結構:

for(initialization; termination; increment) { 
    statements... 
} 

其中:

  • initialization語句被調用一次,當在循環開始

  • termination布爾表達每次迭代之前被評估。如果它產生false,循環終止

  • increment聲明在每次迭代後調用。

有效每for循環可表示爲while循環:

initialization; 
while(termination) { 
    statements; 
    increment; 
} 

正如你可以在你的代碼片段增量看塊是一個布爾表達式(返回boolean),而應該是一個聲明(它應該「做」某事,比如增加一些變量)。這是編譯器試圖說的。

+0

這將有助於我可以添加整個代碼塊,但我不能...:'( – Jamal

+2

我不知道所有關於Java的東西,但OP的原始''for'語句在C語言中絕對是正確的,因爲這個分號。 – Marlon

+0

像@Marlon說的,[C](http://ideone.com/RIpmnT)和[C++](http:///ideone.com/aN3FfJ)沒有問題,但[Java](http://ideone.com/hZSHXm)和[C#](http://ideone.com/vdi56L)不喜歡。 – NullUserException

0

for循環的最後一部分應該是一個語句 - 當控件碰到循環底部時將執行的語句。

記住,for循環for(int i = 0; i < foo; i++),控制是這樣的:

  1. int i = 0;(執行初始化語句)
  2. i < foo;(執行條件檢查)
  3. 若是,則執行循環體。
  4. i++(執行增量步驟)
  5. 返回2.

正如你可以看到,4需要一些事情發生,而不僅僅是獲得一個表達式的值。

0

你做了什麼不對的是,在for循環中的代碼序列是:

for(i=0; i<10; i++) { 
//Code goes here 
} 

的問題是:

//You did *no* initialization, the order was wrong, and no increment. 
for (; predIter.hasNext(); i < filterSize) //wrong 
for (i=0; i < filterSize; i++) //Right 

希望這有助於!

相關問題