前两天用java写了个小程序,用来遍历磁盘的文件,结果跳出来个NullPointException,一开始我以为是我程序的问题,找了半天没找出来错在了哪,当我把遍历的对象改成我的u盘时,程序运行正常,没有报出错误,感觉有点懵逼。。
以下是我程序中的部分代码:
public static class TreeInfo implements Iterable<File>{
private ArrayList<File>files=new ArrayList<File>();
private ArrayList<File>dirs=new ArrayList<File>();
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;
}
可以看到当我们遍历到 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;
}
此时我们的程序就可以运行啦。