2012-11-13 117 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 

希望这有助于!

相关问题