Продолжайте получать NoSuchElementException с помощью сканера

Я пытаюсь прочитать строковые значения, разделенные пробелами. Как только я пытаюсь установить их в переменную, я получаю ошибку NoSuchElementException. Я делал подобные вещи раньше, когда вместо этого мне приходилось использовать целые числа, и я никогда не получал эту ошибку. Проведение некоторых исследований: java.util.NoSuchElementException: чтение слов из файла: в нем говорится, что hasNext реализован для работы с next(), а hasNextLine реализован для работы с nextLine(), поэтому я попытался заменить hasNextLine() на hasNext(), но все равно ничего. Кто-нибудь может помочь?

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();

лабиринт.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)

person adventuredoge    schedule 16.10.2015    source источник


Ответы (4)


Вы должны проверять каждый next() с hasNext(). Кроме того, я бы предпочел читать mazes.txt из домашней папки и try-with-resources Оператор вместо голого 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();
}
person Elliott Frisch    schedule 16.10.2015

Исключение java.util.NoSuchElementException будет сгенерировано, если вы вызовете next() и читать будет нечего.

Кажется, последние две строки в вашем файле имеют 5 значений вместо 6, и вы вызываете next() 6 раз для каждой строки.

person eugenioy    schedule 16.10.2015

Проблема с данными во входном файле. Ваша логика ожидает шесть значений в каждой строке входного файла (maze.text), но четвертая строка в maze.text имеет только пять значений. Вот почему он терпит неудачу. Удалите последние две строки из maze.text, ваш существующий код будет работать. В противном случае вам нужно поставить галочку непосредственно перед чтением в wall4. Что-то вроде этого

String wall4;
if(scanner.hasNext())
wall4 = scanner.next();
person KBR    schedule 16.10.2015

Точно так же, как у вас есть hasNextLine(), вы также должны использовать hasNext().

person user2383728    schedule 16.10.2015
comment
Верно. Не пытался предоставить полное решение. Просто предложение использовать hasNext вместе с hasNextLine. Guess не должен публиковать незавершенный код. - person user2383728; 16.10.2015