今天在android应用中完成一项遍历文件夹的功能。方法参数为文件夹文件夹路径。
开始的代码如下:
private void recursiveDir(String root) {
File file = new File(root);
File [] subFiles = file.listFiles();
for(int i=0; i<subFiles.length; i++) {
recursiveDir(subFiles[i].getAbsolutePath());
}
}
运行后即在 for(int i=0; i<subFiles.length; i++) 报出空指针错误。于是在前面加上判空语句,if(subFiles == null) return;
但是subFiles为什么为空呢?打印出 root 是正确的啊!纠结了一翻后发现 root目录已经被我误删了。我才意识到犯了大错,
用变量前没有检测。于是进行如下修改:
private void recursiveDir(String root)
{
File file = new File(root);
// 检测 参数 的有效性
if (null == file)
{
Log.d(TAG, root + " is not a path");
return;
}
// 检测 文件是否存在
if (!file.exists())
{
Log.d(TAG, "file not exist!");
return;
}
if (file.isDirectory())
{
File[] subFiles = file.listFiles();
// 检测 subFiles 是否正确
if (null == subFiles)
{
return;
}
for (int i = 0; i < subFiles.length; i++)
{
recursiveDir(subFiles[i].getAbsolutePath());
}
}
else
{
// do something
}
}
之后与同事讨论这个问题,同事说在C语言中,为了保证效率,经常不检测参数的有效性,要靠上层传递有效的参数。
看来在编程中要在效率与健壮性上做好协调。