一、Java递归遍历文件NullPointerException错误
源代码
package file;
import java.io.File;
import java.util.ArrayList;
import java.util.Comparator;
public class Demo {
public static void main(String[] args) {
System.out.println("start...");
File f = new File("C:/WINDOWS");
ArrayList<File> fileList = new ArrayList<>();
findFiles(f, fileList);
}
public static void findFiles(File fs, ArrayList<File> fileList) {
File[] fil = fs.listFiles();
for(File fl: fil) {
if(fl.isFile()) {
if(fl.length() == 0) {
return;
}
fileList.add(fl);
System.out.println(fileList.size());
} else {
findFiles(fl, fileList);
}
}
}
}
错误原因
遍历系统盘C:/WINDOWS目录下的所有文件,会出现权限问题
分析原因
修改函数findFiles如下,打印出异常抛出时的文件名,在文件夹中找到对应文件,查看情况
修改函数如下
public static void findFiles(File fs, ArrayList<File> fileList) {
File[] fil = fs.listFiles();
try {
for(File fl: fil) {
if(fl.isFile()) {
if(fl.length() == 0) {
return;
}
fileList.add(fl);
System.out.println(fileList.size());
} else {
findFiles(fl, fileList);
}
}
} catch (Exception e) {
// TODO: handle exception
System.out.println(e);
System.out.println(fs);
Scanner sc = new Scanner(System.in);
sc.next();
sc.close();
}
}
捕获异常文件如下
文件夹中为
解决问题
因为没有文件C:\WINDOWS\CSC权限,fs.listFiles()获取不到当前文件夹下的所有子文件,值为null,即fil为null。所以需要过滤掉这样的文件即可
方式一
if(fil == null) {
return;
}
方式二
try…catch
二、ArrayList.sort()出现IllegalArgumentException错误
原因分析
这个错误就是写比较器的时候少写了返回值的情况,一定不要把返回0这行代码忽悠掉
三、完整代码如下
package file;
import java.io.File;
import java.util.ArrayList;
import java.util.Comparator;
public class Demo {
public static void main(String[] args) {
System.out.println("start...");
File f = new File("C:/WINDOWS");
// File f = new File("d:/study");
ArrayList<File> fileList = new ArrayList<>();
findFiles(f, fileList);
findMaxMinOne(fileList);
findMaxMinTwo(fileList);
}
public static void findMaxMinTwo(ArrayList<File> fil) {
fil.sort(new Comparator<File>() {
@Override
public int compare(File f1, File f2) {
if (f1.length() > f2.length()) {
return 1;
} else if (f1.length() == f2.length()) {
return 0;
}
return -1;
}
});
File sFile = fil.get(0);
File bFile = fil.get(fil.size()-1);
System.out.println("最大的文件是:" + bFile + ",大小为:" + bFile.length());
System.out.println("最小的文件是:" + sFile + ",大小为:" + sFile.length());
}
public static void findMaxMinOne(ArrayList<File> fil) {
File sFile = null;
File bFile = null;
long small = 1000000000;
long big = 0;
for(File fl: fil) {
if(fl.isDirectory()) {
System.out.println(fl + "===" + fl.length());
continue;
}
if(fl.length() == 0)
continue;
if(fl.length() > big) {
big = fl.length();
bFile = fl;
}
if(fl.length() < small) {
small = fl.length();
sFile = fl;
}
}
System.out.println("最大的文件是:" + bFile + ",大小为:" + big);
System.out.println("最小的文件是:" + sFile + ",大小为:" + small);
}
public static void findFiles(File fs, ArrayList<File> fileList) {
File[] fil = fs.listFiles();
if(fil == null) {
return;
}
for(File fl: fil) {
if(fl.isFile()) {
if(fl.length() == 0) {
return;
}
fileList.add(fl);
System.out.println(fileList.size());
} else {
findFiles(fl, fileList);
}
}
}
}