Java Scanner hasNext不匹配分号

时间:2014-05-17 17:05:59

标签: java java.util.scanner

我有这段代码:

    while(s.hasNext()){
        //if (s.hasNext(LOOP))  {  nodes.add(parseLoop(s));  }
        if (s.hasNext("turnL;")){ nodes.add(new TurnLNode()); s.next();}
        if (s.hasNext("turnR;")){ nodes.add(new TurnRNode()); s.next();}
        if (s.hasNext("takeFuel;")){ nodes.add(new TakeFuelNode()); s.next();}
        if (s.hasNext("wait;")){ nodes.add(new WaitNode()); s.next();}
        if (s.hasNext("move;")){ nodes.add(new MoveNode()); s.next();}
        else{
            fail("Invalid command", s);
        }
    }

我正在扫描:

turnL;
move;
turnR
move;

它未能扫描;在第一行。有人可以告诉我为什么吗?

2 个答案:

答案 0 :(得分:1)

当您拨打s.next()时,扫描仪指针会前进,但while正文中的所有其他语句仍会被执行。

此外,您的else语句仅与您上一次if语句相关。因此,当到达最后一个if语句时,代码会识别出第一行与“move”不匹配并执行else语句,因此失败。

您可以通过在所有if语句的末尾添加continue;来解决此问题。这将使while循环前进到下一次迭代而不执行其他if语句。更好的编码风格是用if替换除else if语句之外的所有语句。

答案 1 :(得分:0)

使用s.next()返回turnL,然后是分号,然后移动,然后是下一个分号等等。一个快速的解决方法是使用正则表达式模式的turnL命令,然后在你的解析器中使用另一个分号模式,并检查分号是否遵循第一种模式。

这是因为查看你给出的分隔符​​,并在分配中阅读上面注释的代码,它说 //唯一的时间令牌可以彼此相邻 //当其中一个是(){}时;所以,它将半结肠与其他一切分开,这意味着您需要将分号添加为单独的检查