繁体   English   中英

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

[英]when trying to read and create a file it cause Infinite loop

这是我试图从文件中读取的代码。 我的文件当前有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) {
    }
}

问题是您在不断扩充列表,列表的大小控制着循环的继续本身:

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

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

对我来说,第二个循环的用途是什么还不是很清楚。 使用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());
    }
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM