获取文件树时出错

时间:2014-04-05 12:41:03

标签: java

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)获取文件列表。代码工作,直到我尝试访问子代码。这有什么问题?

2 个答案:

答案 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());