递归目录遍历的堆栈溢出错误

时间:2014-09-05 20:55:56

标签: java android recursion directory stack-overflow

当我运行这个方法时,我立即得到一个堆栈溢出异常,所以显然该方法会递归调用自身,但我不确定原因。作为参考,我测试它的文件结构是一堆文件夹,在那些文件夹中是文件,没有其他文件夹

    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);
        }

    }
    }

   }

2 个答案:

答案 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);
        }