我正在尝试使用此程序来计算D:\驱动器中的所有文件,但是在运行它时会抛出异常。
package lmh;
import java.io.File;
public class FileList {
static int fileNum = 0;
static int directoryNum = 0;
static int cannotRead = 0;
public static void main(String[] args) {
File f = new File("e:/");
printFileStructure(f);
System.out.println("result:");
System.out.println("file number:" + fileNum);
System.out.println("directory number:" + directoryNum);
System.out.println("cannot rend:" + cannotRead);
}
public static void printFileStructure(File f) {
File[] files = f.listFiles();
for (int i = 0; i < files.length; i++) {
if (files[i].isFile()) {
if (files[i].canRead()) {
fileNum++;
System.out.println(files[i].getName());
} else {
cannotRead ++;
}
}
else if (files[i].isDirectory()) {
if (files[i].canRead()) {
directoryNum++;
printFileStructure(files[i]);
} else {
cannotRead ++;
}
}
}
}
}
答案 0 :(得分:5)
File.listFiles()
无法保证返回非空值。这往往会发生(根据我的经验),因为Java可以看到看起来像目录的东西,但是无法列出它(连接点浮现在脑海中)
答案 1 :(得分:3)
即使是
的javadocf.listFiles()
说... 如果此抽象路径名不表示目录,则此方法返回null 。否则返回一个File对象数组,一个用于目录中的每个文件或目录。表示目录本身的路径名和目录的父目录不包含在结果中。每个生成的抽象路径名都是使用File(File,String)构造函数从此抽象路径名构造的。因此,如果此路径名是绝对的,那么每个结果路径名都是绝对的;如果此路径名是相对的,则每个结果路径名将相对于同一目录。
所以我相信这是罪魁祸首。
答案 2 :(得分:2)
由于MadProgrammer指出的原因,添加一个空检查。
替换:
for (int i = 0; i < files.length; i++) {
与
if(files != null)
for (int i = 0; i < files.length; i++) {
我将驱动器更改为D(因为我没有E驱动器),并且使用此修复程序在我的机器上成功完成了程序。
答案 3 :(得分:0)
尝试“E:\\”进入目录。我认为它应该有用。