[英]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.