java.util.NoSuchElementException с использованием только одного сканера

Итак, я пытаюсь прочитать содержимое файла .csv с помощью сканера, и каждый раз, когда я получаю сообщение об ошибке, говорится в заголовке.

Сначала я прочитал в Интернете, что это произошло из-за тот факт, что в вашем проекте не должно быть более одного экземпляра сканера, потому что они могут потреблять входные данные, поэтому я использовал BufferedReader для сканирования по выбору пользователя и сканер для открытия файла .csv.

Теперь я снова получаю сообщение об ошибке, имея только один экземпляр сканера, и я не знаю, почему это происходит.

Вопрос.java

import java.io.File;
import java.io.FileReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;
import java.util.ArrayList;
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Question {
    public static void menu() {
        System.out.println("\nEnter your choice :\n");
        System.out.println("1 - Load Hotels and Reservations from file");
        System.out.println("\nEnter \"1\"");
        int choice = 1;
        BufferedReader br = null;
        try {
            br = new BufferedReader(new InputStreamReader(System.in));
            choice = Integer.parseInt(br.readLine());
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
        if (choice == 1)
            loadOption();
    }

    public static void loadOption() {
        Scanner scan;
        ArrayList<Hotel> hotel = new ArrayList();
        try {
            Hotel hotel = new Hotel();
            scan = new Scanner(new File("data1.csv"));
            scan.useDelimiter(";");
            int column = 1;
            while (scan.hasNext()) {
                scan.next();
                if (column == 1)
                    hotel.id = scan.next();
                if (column == 2)
                    hotel.name = scan.next();
                if (column == 3)
                    hotel.star = scan.next();
                if (column == 4)
                    hotel.rooms = scan.next();
            }
            System.out.print("Files Succesfully Loaded!!!\n");
            scan.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Question obj = new Question();
        obj.menu();
    }

};

Hotel.java

public class Hotel extends Question {
    String id, star, rooms, name;

    public Hotel() {
    } // constructor
};

Вот как я их компилирую:

javac Hotel.java
javac Question.java
java Question

Точная ошибка выглядит так:

Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Scanner.java:862)
    at java.util.Scanner.next(Scanner.java:1371)
    at Question.loadOption(Question.java:43)
    at Question.menu(Question.java:27)
    at Question.main(Question.java:62)

person ceid-vg    schedule 20.04.2016    source источник


Ответы (2)


 String csvFile = "data1.csv";
    BufferedReader br = null;
    String line = "";
    String cvsSplitBy = ",";
     ArrayList <Hotel> hotel = new ArrayList();
    BufferedReader br = new BufferedReader(new FileReader(csvFile));
        while ((line = br.readLine()) != null) {
            Hotel hotelob = new Hotel();
            // use comma as separator
            String[] hotelproperties = line.split(cvsSplitBy);
            //setting properties to hotelobject
            hotelob.id = hotelproperties[0];  
            hotelob.name =hotelproperties[1];
            hotelob.star =hotelproperties[2];
            hotelob.rooms =hotelproperties[3];
            //adding the object to arraylist 
            hotel.add(hotelob);  
        }

вы можете сделать это очень легко, если вы используете bufferedreader таким образом, вы можете обрабатывать несколько строк, и в то же время вы можете легко split данные из каждой строки. поместите этот код в свой метод loadoption, это может помочь.

person Priyamal    schedule 20.04.2016

Вы проверяете hasNext(), но затем дважды вызываете next(). Таким образом, второй вызов не проверен. Хуже того, первый вызов не нужен и не имеет никакого эффекта. Вы также не увеличиваете свою переменную column.

Попробуй это:

Hotel hotel = new Hotel();
scan = new Scanner(new File("data1.csv"));
scan.useDelimiter(";");
int column=1; 
while (scan.hasNext()) {
  //scan.next(); this is not needed
  if (column == 1)
    hotel.id = scan.next();
  if (column == 2)
    hotel.name = scan.next();
  if (column == 3)
    hotel.star = scan.next();
  if (column == 4)
    hotel.rooms = scan.next();
  //this is needed as well:
  column++;
}
System.out.print("Files Succesfully Loaded!!!\n");
scan.close();

Примечание: вы по-прежнему создаете только один экземпляр Hotel.

person f1sh    schedule 20.04.2016
comment
удалите column++ в конце и добавьте column = 1; это не будет работать после первой строки - person Priyamal; 20.04.2016
comment
Конечно, это не сработает после первой строки, как я сказал в примечании внизу. Но column++ нужен в каждой строке. Какой цели служит column = 1 после того, как вы прочитали одно значение? - person f1sh; 20.04.2016
comment
но в какой-то момент column will be equal to 5 тогда что происходит - person Priyamal; 20.04.2016
comment
@Приямал, ничего не случится. Но ваше предложение состоит в том, чтобы просто предположить, что следующее значение сканера следует рассматривать как столбец 1. Необходимо правильно обрабатывать несколько строк, чего вообще не происходит в коде OP. - person f1sh; 20.04.2016