import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class FileTree {
List<File> file_list = new ArrayList<File>();
public List<File> getTree(String root)
{
File f = new File(root);
ArrayList<File> tmp = new ArrayList<File>(Arrays.asList(f.listFiles()));
for(int i = 0; i < tmp.size(); i++)
{
f = tmp.get(i);
if(f.isFile())
file_list.add(f);
else if(f.isDirectory())
getTree(root + "\\" + f.getName());
}
return file_list;
}
}
错误:
Exception in thread "main" java.lang.NullPointerException
at java.util.Arrays$ArrayList.<init>(Arrays.java:2842)
at java.util.Arrays.asList(Arrays.java:2828)
at FileTree.getTree(FileTree.java:12)
at FileTree.getTree(FileTree.java:22)
at Server.main(Server.java:10)
我试图从目录(root)获取文件列表。代码工作,直到我尝试访问子代码。这有什么问题?
答案 0 :(得分:2)
如果文件对象(f)不表示目录(或者发生I / O错误),方法File#listFiles()将产生null
。
因此,在致电f.listFiles()
之前,您应首先检查f
是否代表目录 - 您的输入root
可能不是目录。您可以使用此方法:File#isDirectory()
然后调整逻辑。或者:您没有被授予一个给定子目录的访问权限。在这种情况下,您可以使用方法canRead()
检查可读性(并且不要忘记调试f.getName()
,然后找出您是否有足够的访问权限。)
答案 1 :(得分:0)
形成一个listFiles的java.io.File文档:
返回: 一组抽象路径名,表示此抽象路径名表示的目录中的文件和目录。如果目录为空,则数组将为空。如果此抽象路径名不表示目录,或者发生I / O错误,则返回null。
我看到你正在检查文件是否确实是目录,尽管第一次调用root。那么可能导致您的问题的是I / O错误,例如拒绝权限。 另外,创建根路径字符串的方式可能会导致不同文件系统出现问题,请尝试更改此行
getTree(root + "\\" + f.getName());
进入
getTree(f.getAbsolutePath());