Java扫描程序hasNext与分号不匹配

Java扫描程序hasNext与分号不匹配,java,java.util.scanner,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();} i

我有以下代码:

    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;
它无法扫描数据;在第一行。有人能告诉我为什么吗?

当您调用
s.next()
时,扫描仪的指针向前移动,但是
正文中的所有其他语句仍将执行

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

您可以通过添加
continue。这将使while循环前进到下一个迭代,而不执行其他if语句。更好的编码方式是使用s.next()将除第一个
if
语句以外的所有语句替换为
else if

,然后返回turnL、分号、move、下一个分号等。快速解决方法是对turnL命令使用regex模式,然后在解析器中对分号使用另一个模式,并检查分号是否遵循第一种模式

这是因为查看给定的分隔符,并阅读上面赋值中的注释代码,它说 //令牌可以彼此相邻的唯一时间是
//当其中一个是(){}中的一个时,;因此,它将分号与其他所有内容分开,这意味着您需要添加分号作为单独的检查

Btw,它不应该是
if(){…}else if(){…}else if(){…}else if(){…}else{…}
?实际上,您的
else
只是上次
if
的一部分。扫描仪是如何初始化的?为什么不使用
hasNextLine()
/
nextLine()
?Matt-这只是一个可以扫描的示例。其他人可以在一条线上有多件东西。更确切地说,我的问题是;没有被s.next扫描,@pzaenger说什么可以解决这个问题,试着用他说的去做……仍然没有扫描;刚刚意识到我的问题遗漏了一部分…这不是在扫描中;在文本的第一行,在while循环开始之前,尝试显式地将扫描仪设置为仅使用换行符作为分隔符:
s.useDelimiter(\\n”)
。或者,使用
nextLine();这意味着
turnL
可能在那里,但不是下一个标记。可能您的文件首先包含新行,或者您将此打印行放置在错误的位置。尝试在每次while迭代开始时简单地打印
next()
,或者使用
s.hasNextLine()
作为条件并打印
nextLine()
。我必须扫描的某些内容在一行上有多个语句,因此s.nextLine()不是选项