Java遍历磁盘文件的时候出现空指针异常(NullPointException)

前两天用java写了个小程序,用来遍历磁盘的文件,结果跳出来个NullPointException,一开始我以为是我程序的问题,找了半天没找出来错在了哪,当我把遍历的对象改成我的u盘时,程序运行正常,没有报出错误,感觉有点懵逼。。

   以下是我程序中的部分代码:

  

public static class TreeInfo implements Iterable{
    private ArrayListfiles=new ArrayList();
    private ArrayListdirs=new ArrayList();
    public void addAll(TreeInfo treeInfo){
        this.dirs.addAll(treeInfo.dirs);
        this.files.addAll(treeInfo.files);
    }
    public static TreeInfo walk(File file,final String regex){
        TreeInfo result=new TreeInfo();
        for(File f:file.listFiles()){
            if(f.isDirectory()){
                result.dirs.add(f);
                result.addAll(walk(f,regex));
            }else{
                if(f.getName().matches(regex))
                 result.files.add(f);
            }
        }
        return result;
    }
}

public static void main(String[] args){
		Directory.TreeInfo treeInfo=Directory.TreeInfo.walk("E:\\",0);
	}

运行结果如下:

我想要看看究竟是在遍历哪个文件的时候出错了,于是我将walk方法修改如下:

public static TreeInfo walk(File file,int level){
		TreeInfo result=new TreeInfo();
		File[]files=file.listFiles();
		for(File f:files){
			if(f.isDirectory()){
				System.out.println(f.getName()+" : dir "+level);
				result.dirs.add(f);
				result.addAll(walk(f,level+1));
			}else{
				System.out.println(f.getName()+": file "+level);
				 result.files.add(f);
			}
		}
		return result;
	}

Java遍历磁盘文件的时候出现空指针异常(NullPointException)_第1张图片

可以看到当我们遍历到 System Volume Information 这个文件夹时出现了空指针异常,可是当我看了一下我e盘的目录时发现并没有这个文件夹,

百度了一下才知道这是一个隐藏的系统文件夹,我们没有权限调用这个文件夹,当用这个文件夹的File对象调用file.listFiles()时返回的是null,这样问题就找出来了,

我们只需要在程序中加上一个判空操作即可

public static TreeInfo walk(File file,int level){
        TreeInfo result=new TreeInfo();
        File[]files=file.listFiles();
        if(files==null)
            return result;
        for(File f:files){
            if(f.isDirectory()){
                System.out.println(f.getName()+" : dir "+level);
                result.dirs.add(f);
                result.addAll(walk(f,level+1));
            }else{
                System.out.println(f.getName()+": file "+level);
                 result.files.add(f);
            }
        }
        return result;
    }
此时我们的程序就可以运行啦。

你可能感兴趣的:(学习心得,Java)