这是我试图从文件中读取的代码片段。我的文件目前有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) {
}
}
答案 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());
}
}
(另一个答案解释了它永远不会停止的原因)