在尝试读取和创建文件时,它会导致无限循环

时间:2018-04-26 03:51:32

标签: java javafx while-loop infinite

这是我试图从文件中读取的代码片段。我的文件目前有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 :(得分:2)

问题是你不断扩充列表,其大小控制循环延续本身:

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) {

或者更好的是,通过 NOT 将值添加到循环中的相同列表中。在我看来,这是更明智的解决方案,因为将条目添加到同一列表中没有多大意义。也许您打算将值添加到其他列表对象?

答案 1 :(得分:1)

我不完全清楚第二个循环的用途是什么。使用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());
    }
}

(另一个答案解释了它永远不会停止的原因)