我正在编写一个代码,如果我尝试数组一切正常,但当我尝试用列表解析该示例时,它会显示
Exception in thread "main" java.util.NoSuchElementException
at java.util.AbstractList$Itr.next(Unknown Source)
at com.delete.files.DeleatingFiles.check(DeleatingFiles.java:27)
at com.delete.files.DeleatingFiles.main(DeleatingFiles.java:60)
,代码是:
Map<String, String> map = new HashMap<String, String>();
File folder = new File("F://fileIO/");
if (folder.isDirectory()) {
List<File> filesName = Arrays.asList(folder.listFiles());
Iterator<File> itList = filesName.listIterator();
while (itList.hasNext()) {
map.put(itList.next().getName(), itList.next().toString());
}
System.out.println(map);
}
} else {
System.err.println("something is wrong");
}
}
编辑1:我正在尝试的是将绝对路径的文件名保存为键值对。
编辑2:不能使用String
next = itrList.next()as Iterator是文件类型。
现在,谁能告诉我问题的原因? 请告诉我是否有问题。
感谢。
答案 0 :(得分:4)
您的代码调用next
两次,因此如果itList
的元素数量为奇数,则最后一次调用将导致NoSuchElementException
。
以下是修改代码的方法:
while (itList.hasNext()) {
// Call "next()" once
File next = itList.next();
// Use "next" as many times as you need
map.put(next.getName(), next.toString());
}
有没有其他方法可以在不使用数组的情况下做到这一点?
您可以通过切换到&#34; for-each&#34;来大大简化迭代。循环:
if (folder.isDirectory()) {
for (File file : folder.listFiles()) {
map.put(file.getName(), file.toString());
}
System.out.println(map);
}
现在您的代码不会创建不必要的列表副本,并且没有NoSuchElementException
错误。
答案 1 :(得分:1)
在您的代码map.put(itList.next().getName(), itList.next().toString());
中,即使您检查itList.hasNext()
一次,也请两次调用next()。
while (itList.hasNext()) { // Check once
map.put(itList.next().getName(), itList.next().toString()); // next() Call twice here
}
您的代码可能需要更正,如下所示
Map<String, String> map = new HashMap<String, String>();
File folder = new File("F://fileIO/");
if (folder.isDirectory()) {
List<File> filesName = Arrays.asList(folder.listFiles());
Iterator<File> itList = filesName.listIterator();
File file;
while (itList.hasNext()) {
file = itList.next();
map.put(file.getName(), file.toString());
}
System.out.println(map);
}
else {
System.err.println("something is wrong");
}
答案 2 :(得分:1)
如上所述,你在每个循环中调用next
两次。它也可以使用java-8流来解决。
Map<String, String> map = new HashMap<String, String>();
File folder = new File("F://fileIO/");
if (folder.isDirectory()) {
map = Arrays.asList(folder.listFiles())
.stream()
.collect(Collectors.toMap(File::getName,
Object::toString));
System.out.println(map);
} else {
System.err.println("Something is wrong!");
}
Map<String, String> map = folder.isDirectory ?
map = Arrays.asList(folder.listFiles())
.stream()
.collect(Collectors.toMap(File::getName,
Object::toString)) :
new HashMap<String, String>();