使用Scanner继续获取NoSuchElementException

时间:2015-10-16 01:20:01

标签: java java.util.scanner

我试图读取由空格分隔的字符串值。一旦我尝试将它们设置为变量,我就会得到NoSuchElementException错误。我之前做过类似的事情而不是整数,而且从来没有得到过这个错误。做一些研究:java.util.NoSuchElementException: Read words from a file:它表示hasNext被实现为使用next()而hasNextLine被实现为使用nextLine(),所以我尝试用hasNext()替换hasNextLine(),但仍然没有。有人可以帮忙吗?

File fileName = new File("maze.txt");
Scanner file = new Scanner(fileName);

while(file.hasNextLine()){
    String line = file.nextLine();
    Scanner scanner = new Scanner(line);

    //error starts from here
    String room = scanner.next();
    String roomName = scanner.next();
    String wall1 = scanner.next();
    String wall2 = scanner.next();
    String wall3 = scanner.next();
    String wall4 = scanner.next();
    scanner.close();
}
file.close();

maze.txt

room 101 wall door0 wall wall
room 404 door0 wall door1 wall
room 420 wall wall wall door1
door door0 0 1 close
door door1 1 2 open

错误:

Exception in thread "main" java.util.NoSuchElementException
 at java.util.Scanner.throwFor(Unknown Source)
 at java.util.Scanner.next(Unknown Source)
 at maze.SimpleMazeGame.main(SimpleMazeGame.java:96)

4 个答案:

答案 0 :(得分:6)

您应该使用next()检查每个 hasNext()。另外,我更喜欢从主文件夹和try-with-resources Statement而不是裸mazes.txt读取close()并测试空行输入。你可以用类似的东西来做到这一点

File fileName = new File(System.getProperty("user.home"), "maze.txt");
try (Scanner file = new Scanner(fileName)) {
  while (file.hasNextLine()) {
    String line = file.nextLine();
    if (line.isEmpty()) {
      continue;
    }
    Scanner scanner = new Scanner(line);
    // error starts from here
    String room = scanner.hasNext() ? scanner.next() : "";
    String roomName = scanner.hasNext() ? scanner.next() : "";
    String wall1 = scanner.hasNext() ? scanner.next() : "";
    String wall2 = scanner.hasNext() ? scanner.next() : "";
    String wall3 = scanner.hasNext() ? scanner.next() : "";
    String wall4 = scanner.hasNext() ? scanner.next() : "";
  }
} catch (Exception e) {
  e.printStackTrace();
}

答案 1 :(得分:2)

输入文件中的数据存在问题。您的逻辑在输入文件的每一行(maze.text)中需要六个值,但maze.text中的fouth行只有五个值。这就是它失败的原因。从maze.text中删除最后两行,您的现有代码将起作用。否则你需要在阅读wall4之前进行检查。像这样的东西

String wall4;
if(scanner.hasNext())
wall4 = scanner.next();

答案 2 :(得分:1)

如果您拨打java.util.NoSuchElementException并且没有任何内容可供阅读,则会引发异常next()

您文件中的最后两行似乎有5个值而不是6个,并且每行调用next() 6次。

答案 3 :(得分:0)

就像你有hasNextLine()一样,你也应该使用hasNext()。