当我运行这个方法时,我立即得到一个堆栈溢出异常,所以显然该方法会递归调用自身,但我不确定原因。作为参考,我测试它的文件结构是一堆文件夹,在那些文件夹中是文件,没有其他文件夹
public void files(File[] f)
{
if(f == null){
return;
}
else
{
for(int i = 0; i < f.length; i++)
{
if(f[i].isFile() && (f[i].getName().contains(".mp3") || f[i].getName().contains(".m4a"))) //iterate through files and check if each file matches the required criteria
{
String fullname = f[i].getName();
Log.v("full name", fullname);
String name = null;
if(fullname.contains(".mp3"))
{
name = fullname.substring(0, fullname.lastIndexOf(".mp3"));
}
else if(fullname.contains(".m4a")) //Removing file extensions of music file so they can be displayed using an appropriate name
{
name = fullname.substring(0, fullname.lastIndexOf(".m4a"));
}
list.add(name);
mp3.add(f[i]);
Log.v("added", name);
}
if(f[i].isDirectory())
{
File inner[] = files[i].listFiles();
files(inner);
}
}
}
}
答案 0 :(得分:0)
也许有些文件是“。”和“..”这意味着,我认为,当前文件夹和后面的一个文件夹。
所以在你的isDirectory()部分if检查中也检查f [i]!=“。”和f [i]!=“..”
if(f[i].isDirectory() and f[i]!="." and f[i]!="..")
{
File inner[] = files[i].listFiles();
files(inner);
}
编辑:
正如@Jon所说,尝试为它添加更多调试,看看它到底在哪里打破。
LATER EDIT:
对于未来的读者,问题在于:
//File inner[] = files[i].listFiles();
File inner[] = f[i].listFiles();
答案 1 :(得分:0)
我这样的超级愚蠢的错误,当从先前的非递归实现复制代码时,我忘了将文件更改为f
if(f[i].isDirectory())
{
File inner[] = files[i].listFiles();
files(inner);
}