【问题标题】:Stack Overflow error from recursive directory traversal递归目录遍历的堆栈溢出错误
【发布时间】:2014-10-30 21:04:28
【问题描述】:

当我运行这个方法时,我立即得到一个堆栈溢出异常,所以很明显该方法不断递归地调用自己,但我不知道为什么。作为参考,我正在测试它的文件结构是一堆文件夹,在这些文件夹中是文件,没有其他文件夹

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

    }
    }

   }

【问题讨论】:

  • 我要做的第一件事是添加更多日志记录。接下来我要做的是将递归调用更改为接受 one 文件 - 只是因为这更容易处理。
  • 尝试了使用 4 个文件夹和相当多的文件,效果很好

标签: java android recursion directory stack-overflow


【解决方案1】:

也许有些文件是“.”和“..”这意味着,我认为,当前文件夹并返回一个文件夹。

所以在 if 检查的 isDirectory() 部分中还要检查是否 f[i]!="."和 f[i]!=".."

if(f[i].isDirectory() and f[i]!="." and f[i]!="..")
    {
        File inner[] = files[i].listFiles();
        files(inner);
    }

编辑:

正如@Jon 所说,尝试向它添加更多调试,看看它到底在哪里中断。

稍后编辑:

对于未来的读者来说,问题就在这里:

    //File inner[] = files[i].listFiles();
    File inner[] = f[i].listFiles();

【讨论】:

  • 这是我的第一个想法,写了它然后删除了它,因为 listFiles 的 javadocs 明确地说 .和 .. 不返回。 docs.oracle.com/javase/7/docs/api/java/io/File.html#listFiles()
  • 我才注意到这个,files[i]是谁,不应该是f[i]吗?
  • 是的 Radu 你明白了,这只是我的一个愚蠢的错误。 +1 为什么你不应该复制和粘贴大量代码
【解决方案2】:

我犯了一个超级愚蠢的错误,从以前的非递归实现中复制代码时,我忘记将文件更改为 f in

if(f[i].isDirectory())
        {
            File inner[] = files[i].listFiles();
            files(inner);
        }

【讨论】:

    猜你喜欢
    • 2018-03-10
    • 2014-08-27
    • 2011-10-17
    • 2016-11-11
    • 2015-06-17
    • 1970-01-01
    • 2016-12-30
    • 2015-02-08
    • 1970-01-01
    相关资源
    最近更新 更多