我在用这段代码访问的服务器上有一系列包含书籍的文件夹。我想使每个文件夹成为一个对象,以便以后可以对其中的文件进行一些处理。我正在尝试使用此方法将文件夹列表作为Book对象返回。
public List<Book> getBooks(File folder){
List<Book> books = new ArrayList<Book>();
for (File f : folder.listFiles()){
if (f.isDirectory()){
System.out.println(f.getAbsolutePath() + "" + f.listFiles());
books.add(new Book(f));
}
}
return books;
}
此块中的println语句按应有的方式打印文件夹的直接路径,然后打印内存地址以及其他一些信息。但是,在文件夹中的某个位置,当调用listFiles()时,它的输出为null。执行此操作的文件夹不为空。然后,这个空文件夹被传递给我的类init方法。
public Book(File bookFolder) {
this.bookFolder = bookFolder;
this.bookPath = bookFolder.getAbsolutePath();
System.out.println(bookFolder + " " + bookFolder.listFiles());
for (File f : bookFolder.listFiles()) {
...
}
}
此块中的println语句打印出与文件夹完全相同的路径,然后打印出不同的内存地址,这也是预期的。当它打到“空”文件夹时,它将再次为内存地址输出null。
现在,对于真正的问题,带有for循环的行是程序崩溃并引发NullPointerException的地方,在listFiles方法的文档中甚至没有描述。
为什么会这样呢?另外,为什么我的非空文件夹返回null?
最佳答案
listFiles()
方法的文档明确指出:“如果此抽象路径名不表示目录,或者发生I/O错误,则返回null。”
无法列出目录的最常见原因之一是该进程缺少正确的权限。您是自己运行还是在以其他用户身份运行的某种服务中运行它?
顺便说一句,File
API是一个很好的例子,说明无异常(exception)的生活会多么糟糕。
关于java - 在目录上调用listFiles()时出现Java NullPointerException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6117191/