喜 我有一个小程序,从命令行获取一个目录,并添加此目录及其子文件夹中的所有文件..所以这里是代码:
package oop.ex1.filescript;
import java.io.*;
import java.util.ArrayList;
public class MyFileScript {
public static void main(String[] args) {
File dir = new File(args[0]);
//LINE 13
ArrayList<File> files = readAllFiles(dir.listFiles());
}
private static ArrayList<File> readAllFiles(File[] dir){
ArrayList<File> result = new ArrayList<File>();
//LINE 28
for(File itr : dir) {
result.add(itr);
if (!itr.isFile()) {
File[] temp = itr.listFiles();
//LINE 32
ArrayList<File> deeperList = readAllFiles(temp);
result.addAll(deeperList);
}
}
return result;
}
}
现在,当我在某些文件夹中运行它时,文件中的文件不多,一切都还可以,但是当我用大量文件提供文件夹时,我得到了:
Exception in thread "main" java.lang.NullPointerException
at oop.ex1.filescript.MyFileScript.readAllFiles(MyFileScript.java:28)
at oop.ex1.filescript.MyFileScript.readAllFiles(MyFileScript.java:32)
at oop.ex1.filescript.MyFileScript.readAllFiles(MyFileScript.java:32)
at oop.ex1.filescript.MyFileScript.main(MyFileScript.java:13)
关于它为什么会发生的任何想法?谢谢! 附:我标记了行号!
答案 0 :(得分:3)
看起来dir.listFiles返回null。
引用doc,“如果此抽象路径名不表示目录,或者发生I / O错误,则返回null。”。
答案 1 :(得分:2)
第28行中的dir
变量可能为null。您可能希望在调用dir.listFiles()
之前检查readAllFiles
的结果。
答案 2 :(得分:1)
而不是
if (!itr.isFile()) {
使用
if (itr.isDirectory()) {
如果它不是文件,则不一定是目录。
答案 3 :(得分:0)
您应该if (itr.isDirectory())
并检查空if (tmp != null)
。
答案 4 :(得分:0)
我会使用listFile(FileFilter)
并让FileFilter
返回File.canRead()
。看看你是否得到了所有预期的文件,如果没有弄清楚为什么它们不可读。
答案 5 :(得分:0)
public static List<File> getAllChildFiles(File[] dir)
{
List<File> result = new ArrayList<File>();
for (File file : dir)
{
if (file.isDirectory())
{
File[] children = file.listFiles();
List<File> grandChildren = getAllChildFiles(children);
result.addAll(grandChildren);
}
else
{
result.add(file);
}
}
return result;
}