при попытке прочитать и создать файл вызывает бесконечный цикл - PullRequest
0 голосов
/ 26 апреля 2018

Это мой кусок кода, где я пытаюсь прочитать из файла.Мой файл в настоящее время имеет 4 строки, но после чтения этих строк код не выходит из цикла.

public  void readPhoneBook() throws Exception {
    try {
        FileReader fileReader = new FileReader(file);
        Scanner reader = new Scanner(file);
        BufferedReader input = new BufferedReader(fileReader);

        while (reader.hasNext()) {
            String[] parts = reader.nextLine().split(" ");
            if (parts.length == 4){
                PhoneBook newPhone = new PhoneBook(parts[0],parts[1],parts[2],parts[3]);
                entryList.add(newPhone);
            }

            fileReader.close();
            reader.close();
            for (int i=0; i < entryList.size(); ++i) {
                entryList.add(new PhoneBook(entryList.get(i).getFirstName(), entryList.get(i).getLastName(),
                        entryList.get(i).getNumber(),entryList.get(i).getNote()));
                System.out.println("2"+entryList.size());
            }
        }

    } catch (Exception NoSuchElementException) {
    }
}

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Мне не совсем понятно, какой смысл использовать второй цикл.Используя Java 8 и потоковую передачу, вы можете реализовать это следующим образом:

public List<PhoneBook> readPhoneBook(Path file) throws Exception {
     return Files.lines(file)
         .map(line -> reader.split(" "))
         .filter(parts -> parts.length == 4)
         .map(parts -> new PhoneBook(parts[0],parts[1],parts[2],parts[3])
         .collect(Collectors.toList());
    }
}

(другой ответ объяснил причину, по которой он никогда не останавливается)

0 голосов
/ 26 апреля 2018

Проблема в том, что вы постоянно расширяете список, размер которого контролирует само продолжение цикла:

for (int i=0; i < entryList.size(); ++i) {
    ...  
    entryList.add(new PhoneBook(entryList.get(i).getFirstName(), 
        entryList.get(i).getLastName(),
        entryList.get(i).getNumber(), entryList.get(i).getNote()));

Оператор entryList.add... добавляет значение в список, так что когдаусловие цикла оценивается для следующей итерации, entryList.size() будет еще больше.

Вы можете исправить это, прочитав размер перед циклом:

int entryListSize = entryList.size();
for (int i=0; i < entryListSize; ++i) {

Или, еще лучше, НЕ добавление значений в тот же список в цикле.На мой взгляд, это более разумное решение, так как нет смысла добавлять записи в один и тот же список.Может быть, вы намеревались добавить значения в другой объект списка?

...