Java 编译器错误:";不是一份声明”;

Java 编译器错误:";不是一份声明”;,java,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 = fi

这是代码片段:

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);
布尔节点过滤=false;
过滤器集=新节点集;
整数滤波;
int i;
对于(;predIter.hasNext();i

当它说
i
编译器说我有一个错误…它说它不是一个语句…

事实上,这行是不正确的:

for (; predIter.hasNext(); i < filterSize)
其中:

  • 初始化
    语句在循环启动时调用一次

  • 终止
    boolean表达式在每次迭代之前进行计算。如果它产生
    false
    ,循环终止

  • 增量
    语句在每次迭代后调用

实际上,每个
for
循环都可以表示为
,而
循环:

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

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

for循环的最后一部分应该是一条语句——它是控件到达循环底部时将执行的语句

请记住,对于for循环(inti=0;i
,控件如下所示:

  • int i=0;
    (执行初始化语句)
  • i
    (执行条件检查)
  • 如果是,则执行循环体
  • i++
    (执行增量步骤)
  • 回到2

  • 正如您所看到的,4.需要发生一些事情,而不仅仅是获取表达式的值。

    错误在于,在for循环中,代码序列是:

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

    对于(i=0;i)我将程序减小到最小大小,这样您就可以重现相同的错误。您很可能会自己找到答案,但如果您不能在此处再次询问,我可以添加整个代码块,但我无法……。:'(我对Java一无所知,但OP最初的
    for
    语句在C中肯定是正确的,因为这个分号。就像@Marlon说的,没有问题,但是也不喜欢它。@Marlon:谢谢你澄清这一点。虽然
    for
    的语法和结构在C和Java中是一样的,但看起来像是Java编译器更严格。我删除了关于C语法的部分。
    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