在目录上调用listFiles()时发生Java NullPointerException
我在服务器上有一系列包含书籍的文件夹,我正在使用这段代码访问这些文件夹。我想让这些文件夹中的每一个都成为一个对象,这样我以后就可以处理其中的文件了。我正在尝试使用此方法将文件夹列表作为图书对象返回在目录上调用listFiles()时发生Java NullPointerException,java,nullpointerexception,Java,Nullpointerexception,我在服务器上有一系列包含书籍的文件夹,我正在使用这段代码访问这些文件夹。我想让这些文件夹中的每一个都成为一个对象,这样我以后就可以处理其中的文件了。我正在尝试使用此方法将文件夹列表作为图书对象返回 public List<Book> getBooks(File folder){ List<Book> books = new ArrayList<Book>(); for (File f : folder.listFiles()){
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语句打印出文件夹的完全相同路径,然后打印出不同的内存地址,这也是预期的。当它点击“空”文件夹时,它会再次为内存地址打印null
现在,对于真正的问题,带有for循环的行是程序崩溃并抛出一个NullPointerException的地方,而listFiles方法的文档中甚至没有描述这个问题
为什么会发生这种情况?另外,为什么我的非空文件夹返回null?该方法的文档明确指出,“如果此抽象路径名不表示目录,或者如果发生I/O错误,则返回null。”
无法列出目录的最常见原因之一是进程缺少正确的权限。您是以自己的身份运行它,还是以其他用户的身份运行某种服务
顺便说一句,
文件
API是一个很好的例子,说明生活是多么糟糕,没有例外。我对dir.listfiles()也有类似的问题;为用户文件夹\AppData\Local\Microsoft\Windows\Temporary Internet Files\Content.IE5返回null\
默认情况下,文件夹的权限设置为“everyone”Deny all
我想,让我心烦的是,我从来没想过会有人拒绝允许我在那里生存
也适用于任何一个不清楚我所说的拒绝许可是什么意思的人
当您为用户权限设置“拒绝”时,它会覆盖“允许用户权限”,除非您将其删除,并且它是在windows 10 home的默认安装中进行的。对我来说,这是由尾随空格引起的。对于已经包含以下解决方案的开发人员,请使用variable.trim()
2.要列出文件的目录已存在
堆栈跟踪的存在是有原因的。阅读它,理解它。@Mat-如果要迭代的对象为空,“foreach”操作符(:
)抛出NPE(在您的情况下,bookFolder.listFiles()
)@skaffman-stacktrace只告诉您NPE发生的位置,而不是原因。有时是明显的,有时不是,这取决于这条线的进展情况。@Kevin K-谢谢,这就是我一直在寻找的答案。现在我必须首先弄清楚为什么它们是空的。顺便说一句,你的变量名令人困惑。书籍
是一个文件
,要将其添加到书籍
列表中,必须从书籍
创建一本书籍
。我建议不要把书和文件混为一谈。另一个原因可能是文件不是目录。嗯,一般来说确实如此!但是,在这种情况下,似乎已经进行了适当的测试来排除这种情况。@erickson我想知道,当我确定它们包含其他文件时,它们为什么返回null。该路径肯定是一个目录,因为我检查以确保它是一个目录,并且同一服务器上的其他文件夹可以使用此代码正常工作,因此我认为这不是权限问题。此代码使用的服务以管理员用户身份运行,这使我更加确定它不是权限问题。@erickson-非常感谢您的帮助你的帮助。事实证明,由于打开了太多文件,我的空间似乎用完了,这似乎就是listFiles()开始返回null而不是内存地址的原因。
public Book(File bookFolder) {
this.bookFolder = bookFolder;
this.bookPath = bookFolder.getAbsolutePath();
System.out.println(bookFolder + " " + bookFolder.listFiles());
for (File f : bookFolder.listFiles()) {
...
}
}
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<application android:requestLegacyExternalStorage="true"...</application>