编译错误:“不是声明”

时间:2012-11-13 17:41:30

标签: java

这是代码段:

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)编译器说我有错误......它说它不是声明......

3 个答案:

答案 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;
}

正如您在代码片段中看到的那样 increment 块是一个布尔表达式(返回boolean),而它应该是一个语句(它应该“做”某事,比如递增一些变量)。这就是编译器试图说的。

答案 1 :(得分:0)

for循环的最后一部分应该是一个声明 - 它是当控制命中循环底部时将执行的内容。

请记住,对于for循环for(int i = 0; i < foo; i++),控件如下:

  1. int i = 0;(执行初始化语句)
  2. i < foo;(执行条件检查)
  3. 如果是,请执行循环体。
  4. i++(执行增量步骤)
  5. 回到2。
  6. 正如您所看到的,4需要发生一些事情,而不仅仅是获取表达式的值。

答案 2 :(得分: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

希望这有帮助!